added SplitString.h and MergeString.h
This commit is contained in:
47
inc/hgl/type/MergeString.h
Normal file
47
inc/hgl/type/MergeString.h
Normal file
@@ -0,0 +1,47 @@
|
||||
#ifndef HGL_MERGE_STRING_INCLUDE
|
||||
#define HGL_MERGE_STRING_INCLUDE
|
||||
|
||||
#include<hgl/type/StringList.h>
|
||||
namespace hgl
|
||||
{
|
||||
/**
|
||||
* <20><>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>ϳ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param sl Ҫ<><D2AA><EFBFBD>ϵ<EFBFBD><CFB5>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param end_line <20><><EFBFBD>з<EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
*/
|
||||
template<typename T> String<T> MergeString(const StringList<T> &sl,const String<T> &end_line)
|
||||
{
|
||||
int total_chars=0;
|
||||
|
||||
const int line=sl.GetCount();
|
||||
String<T> **sp=sl.GetDataList();
|
||||
|
||||
for(int i=0;i<line;i++)
|
||||
{
|
||||
total_chars+=(*sp)->Length();
|
||||
|
||||
++sp;
|
||||
}
|
||||
|
||||
total_chars+=line*end_line.Length();
|
||||
|
||||
T *str=new T[total_chars+1];
|
||||
T *tp=str;
|
||||
|
||||
sp=sl.GetDataList();
|
||||
for(int i=0;i<line;i++)
|
||||
{
|
||||
hgl_cpy(tp,(*sp)->c_str(),(*sp)->Length());
|
||||
tp+=(*sp)->Length();
|
||||
hgl_cpy(tp,end_line.c_str(),end_line.Length());
|
||||
tp+=end_line.Length();
|
||||
|
||||
++sp;
|
||||
}
|
||||
|
||||
str[total_chars]=0;
|
||||
return String<T>::newOf(str,total_chars);
|
||||
}
|
||||
}//namespace hgl
|
||||
#endif//HGL_MERGE_STRING_INCLUDE
|
441
inc/hgl/type/SplitString.h
Normal file
441
inc/hgl/type/SplitString.h
Normal file
@@ -0,0 +1,441 @@
|
||||
#ifndef HGL_SPLIT_STRING_INCLUDE
|
||||
#define HGL_SPLIT_STRING_INCLUDE
|
||||
|
||||
#include<hgl/type/StringList.h>
|
||||
namespace hgl
|
||||
{
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> class SplitString
|
||||
{
|
||||
public:
|
||||
|
||||
virtual ~SplitString()=default;
|
||||
|
||||
virtual void OnNewString(const T *,const int)=0; ///<<3C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>µ<EFBFBD><C2B5>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
|
||||
virtual bool isSeparatorChar(const T &)=0; ///<<3C>Ƿ<EFBFBD><C7B7>Ƿָ<C7B7><D6B8><EFBFBD>
|
||||
virtual uint isSeparator(const T *str)
|
||||
{
|
||||
uint size=0;
|
||||
|
||||
while(isSeparatorChar(*str))
|
||||
{
|
||||
++size;
|
||||
++str;
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
virtual int Split(const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
int count=0;
|
||||
int sc=0;
|
||||
const T *p,*sp;
|
||||
|
||||
sp=p=str;
|
||||
|
||||
while(size>0)
|
||||
{
|
||||
if(!(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
OnNewString(sp,p-sp);
|
||||
++count;
|
||||
}
|
||||
|
||||
--size;
|
||||
return count;
|
||||
}
|
||||
|
||||
sc=isSeparator(p);
|
||||
if(sc>0)
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
OnNewString(sp,p-sp);
|
||||
++count;
|
||||
}
|
||||
|
||||
p+=sc; ///<<3C><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>
|
||||
size-=sc;
|
||||
|
||||
sp=p;
|
||||
}
|
||||
else
|
||||
{
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
}
|
||||
|
||||
if(p>sp)
|
||||
{
|
||||
OnNewString(sp,p-sp);
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
virtual int Split(const String<T> &str)
|
||||
{
|
||||
return Split(str.c_str(),str.Length());
|
||||
}
|
||||
};//template<typename T> class SplitString
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> class SplitStringToStringList:public SplitString<T>
|
||||
{
|
||||
protected:
|
||||
|
||||
StringList<T> *string_list;
|
||||
|
||||
public:
|
||||
|
||||
SplitStringToStringList(StringList<T> *sl)
|
||||
{
|
||||
string_list=sl;
|
||||
}
|
||||
|
||||
virtual ~SplitStringToStringList()=default;
|
||||
|
||||
virtual void OnNewString(const T *str,const int size) override
|
||||
{
|
||||
if(!str||size<=0)return;
|
||||
|
||||
string_list->Add(String<T>(str,size));
|
||||
}
|
||||
|
||||
virtual int Split(const T *str,int size) override
|
||||
{
|
||||
if(!string_list)return(-1);
|
||||
|
||||
return SplitString::Split(str,size);
|
||||
}
|
||||
|
||||
virtual int Split(const String<T> &str) override
|
||||
{
|
||||
if(!string_list)return(-1);
|
||||
|
||||
return SplitString::Split(str.c_str(),str.Length());
|
||||
}
|
||||
};//template<typename T> class SplitStringToStringList:public SplitString
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T,typename C> class SplitStringToStringListByCondition:public SplitStringToStringList<T>
|
||||
{
|
||||
const C (*isFunc)(const T &);
|
||||
C is_condition;
|
||||
|
||||
public:
|
||||
|
||||
SplitStringToStringListByCondition(StringList<T> *sl,const C (*func)(const T &),const C is_con):SplitStringToStringList(sl)
|
||||
{
|
||||
isFunc=func;
|
||||
is_condition=is_con;
|
||||
}
|
||||
virtual ~SplitStringToStringListByCondition()=default;
|
||||
|
||||
bool isSeparatorChar(const T &ch) override
|
||||
{
|
||||
return isFunc(ch)==is_condition;
|
||||
}
|
||||
|
||||
virtual int Split(const T *str,int size) override
|
||||
{
|
||||
if(!isFunc)return(-1);
|
||||
|
||||
return SplitStringToStringList::Split(str,size);
|
||||
}
|
||||
|
||||
virtual int Split(const String<T> &str) override
|
||||
{
|
||||
if(!isFunc)return(-1);
|
||||
|
||||
return SplitStringToStringList::Split(str.c_str(),str.Length());
|
||||
}
|
||||
};//template<typename T,typename C> class SplitStringToStringListByCondition:public SplitStringToStringList<T>
|
||||
|
||||
/**
|
||||
* <20>Բ<EFBFBD><D4B2>ɴ<EFBFBD>ӡ<EFBFBD>ַ<EFBFBD>Ϊ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListBySpace(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
SplitStringToStringListByCondition split(&sl,isspace,true);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringListBySpace
|
||||
|
||||
#define SPLIT_STRING_TO_STRING_LIST(name) template<typename T> int SplitToStringListBy##name(StringList<T> &sl,const String<T> &str) \
|
||||
{ \
|
||||
return SplitToStringListBy##name(sl,str.c_str(),str.Length()); \
|
||||
}
|
||||
|
||||
SPLIT_STRING_TO_STRING_LIST(Space)
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListByCodes(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
SplitStringToStringListByCondition split(&sl,iscodechar,false);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringListByCodes
|
||||
|
||||
SPLIT_STRING_TO_STRING_LIST(Codes)
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListByDigit(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
SplitStringToStringListByCondition split(&sl,isdigit,false);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringListByDigit
|
||||
|
||||
SPLIT_STRING_TO_STRING_LIST(Digit)
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD>16<31><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListByXDigit(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
SplitStringToStringListByCondition split(&sl,isxdigit,false);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringListByXDigit
|
||||
|
||||
SPLIT_STRING_TO_STRING_LIST(XDigit)
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListByFloat(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
SplitStringToStringListByCondition split(&sl,isfloat,false);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringListByFloat
|
||||
|
||||
SPLIT_STRING_TO_STRING_LIST(Float)
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> class SplitStringToStringListByChar:public SplitStringToStringList<T>
|
||||
{
|
||||
T separator_char;
|
||||
|
||||
public:
|
||||
|
||||
SplitStringToStringListByChar(StringList<T> *sl,const T &sc):SplitStringToStringList(sl)
|
||||
{
|
||||
separator_char=sc;
|
||||
}
|
||||
virtual ~SplitStringToStringListByChar()=default;
|
||||
|
||||
bool isSeparatorChar(const T &ch) override
|
||||
{
|
||||
return ch==separator_char;
|
||||
}
|
||||
};//template<typename T,typename C> class SplitStringToStringListByChar:public SplitStringToStringList<T>
|
||||
|
||||
/**
|
||||
* <20><>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD>Ϊ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param split_char <20>ָ<EFBFBD><D6B8>ַ<EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListByChar(StringList<T> &sl,const T *str,int size,const T &split_char)
|
||||
{
|
||||
SplitStringToStringListByChar split(&sl,split_char);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringList
|
||||
|
||||
template<typename T> int SplitToStringListByChar(StringList<T> &sl,const String<T> &str,const T &split_char)
|
||||
{
|
||||
return SplitToStringList<T>(sl,str.c_str(),str.Length(),split_char);
|
||||
}
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> class SplitStringToStringListByChars:public SplitStringToStringList<T>
|
||||
{
|
||||
String<T> separator_char;
|
||||
|
||||
public:
|
||||
|
||||
SplitStringToStringListByChar(StringList<T> *sl,const String<T> &sc):SplitStringToStringList(sl)
|
||||
{
|
||||
separator_char=sc;
|
||||
}
|
||||
virtual ~SplitStringToStringListByChar()=default;
|
||||
|
||||
bool isSeparatorChar(const T &ch) override
|
||||
{
|
||||
return separator_char.FindChar(ch)!=-1;
|
||||
}
|
||||
};//template<typename T,typename C> class SplitStringToStringListByChars:public SplitStringToStringList<T>
|
||||
|
||||
/**
|
||||
* <20><>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD>Ϊ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param split_char <20>ָ<EFBFBD><D6B8>ַ<EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListByChars(StringList<T> &sl,const T *str,int size,const String<T> &split_chars)
|
||||
{
|
||||
SplitStringToStringListByChars split(&sl,split_chars);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringList
|
||||
|
||||
template<typename T> int SplitToStringListByChars(StringList<T> &sl,const String<T> &str,const String<T> &split_chars)
|
||||
{
|
||||
return SplitToStringList<T>(sl,str.c_str(),str.Length(),split_chars);
|
||||
}
|
||||
|
||||
/**
|
||||
* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringListByEnter(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
const T sc[2]={T('\r'),T('\n')};
|
||||
|
||||
SplitStringToStringListByChars split(&sl,sc);
|
||||
|
||||
return split.Split(str,size);
|
||||
}//int SplitToStringList
|
||||
|
||||
SPLIT_STRING_TO_STRING_LIST(Enter)
|
||||
|
||||
#undef SPLIT_STRING_TO_STRING_LIST
|
||||
|
||||
/**
|
||||
* <20><>ָ<EFBFBD><D6B8><EFBFBD>ַ<EFBFBD>Ϊ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
* @param sl <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param str <20>ַ<EFBFBD><D6B7><EFBFBD>
|
||||
* @param size <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param split_char <20>ָ<EFBFBD><D6B8>ַ<EFBFBD>
|
||||
* @param maxSize <20><><EFBFBD><EFBFBD>ִ<EFBFBD>д<EFBFBD><D0B4><EFBFBD>
|
||||
* @return <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
template<typename T> int SplitToStringList(StringList<T> &sl,const T *str,int size,const T &split_char,int maxSize)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
int count=0;
|
||||
const T *p,*sp;
|
||||
|
||||
sp=p=str;
|
||||
|
||||
while(size>0)
|
||||
{
|
||||
if(!(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
--size;
|
||||
return count;
|
||||
}
|
||||
|
||||
if(*p==split_char)
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
sp=p+1; ///<<3C><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>
|
||||
if(maxSize >0 && count >=maxSize-1)
|
||||
{
|
||||
++p;
|
||||
--size;
|
||||
if(size > 0)
|
||||
{
|
||||
sl.Add(String<T>(sp,size));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}//int SplitToStringList
|
||||
|
||||
template<typename T> int SplitToStringList(StringList<T> &sl,const String<T> &str,const T &split_char,int maxSize)
|
||||
{
|
||||
return SplitToStringList<T>(sl,str.c_str(),str.Length(),split_char,maxSize);
|
||||
}
|
||||
}//namespace hgl
|
||||
#endif//HGL_SPLIT_STRING_INCLUDE
|
@@ -140,7 +140,7 @@ namespace hgl
|
||||
* @param str 要查找的字符串
|
||||
* @return 查找到的字符串的索引,未找到返回-1
|
||||
*/
|
||||
int Find(const StringClass &str) const ///<查找字符串,未找到返回-1
|
||||
int Find(const StringClass &str) const ///<查找字符串,未找到返回-1
|
||||
{
|
||||
const int count=Items.GetCount();
|
||||
StringClass** sl = Items.GetData();
|
||||
@@ -159,7 +159,7 @@ namespace hgl
|
||||
* @param str 要指找的字符串
|
||||
* @return 查找到的字符串的索引,未找到返回-1
|
||||
*/
|
||||
int CaseFind(const StringClass &str) const ///<查找字符串,英文无视大小写,未找到返回-1
|
||||
int CaseFind(const StringClass &str) const ///<查找字符串,英文无视大小写,未找到返回-1
|
||||
{
|
||||
const int count=Items.GetCount();
|
||||
StringClass** sl = Items.GetData();
|
||||
@@ -179,7 +179,7 @@ namespace hgl
|
||||
* @param cn 限定的要查找字符串的最大长度
|
||||
* @return 查找到的字符串的索引,未找到返回-1
|
||||
*/
|
||||
int Find(const StringClass &str,const int cn) const ///<查找字符串,未找到返回-1
|
||||
int Find(const StringClass &str,const int cn) const ///<查找字符串,未找到返回-1
|
||||
{
|
||||
const int count=Items.GetCount();
|
||||
|
||||
@@ -200,7 +200,7 @@ namespace hgl
|
||||
* @param cn 限定的要查找字符串的最大长度
|
||||
* @return 查找到的字符串的索引,未找到返回-1
|
||||
*/
|
||||
int CaseFind(const StringClass &str,const int cn) const ///<查找字符串,英文无视大小写,未找到返回-1
|
||||
int CaseFind(const StringClass &str,const int cn) const ///<查找字符串,英文无视大小写,未找到返回-1
|
||||
{
|
||||
const int count=Items.GetCount();
|
||||
|
||||
@@ -220,7 +220,7 @@ namespace hgl
|
||||
* @param index 要插入字符串的位置
|
||||
* @param str 要插入的字符串
|
||||
*/
|
||||
void Insert(int index,const StringClass &str) ///<在指定位置插入一个字符串
|
||||
void Insert(int index,const StringClass &str) ///<在指定位置插入一个字符串
|
||||
{
|
||||
if(index<Items.GetCount())
|
||||
Items.List<StringClass *>::Insert(index,new StringClass(str));
|
||||
@@ -236,411 +236,10 @@ namespace hgl
|
||||
Items.Exchange(index1,index2);
|
||||
}
|
||||
|
||||
const StringClass &GetString(int n)const{return *(Items[n]);} ///<取得指定行字符串
|
||||
const StringClass &GetString(int n)const{return *(Items[n]);} ///<取得指定行字符串
|
||||
};//template<typename T> class StringList
|
||||
|
||||
template<typename T> String<T> StringList<T>::NullString; ///<空字符串实例
|
||||
|
||||
/**
|
||||
* 以不可打印字符为分隔拆解一个字符串到一个字符串列表
|
||||
* @param sl 字符串列表处理类
|
||||
* @param str 字符串
|
||||
* @param size 字符串长度
|
||||
* @return 字符串行数
|
||||
*/
|
||||
template<typename T> int SplitToStringListBySpace(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
int count=0;
|
||||
const T *p,*sp;
|
||||
|
||||
sp=p=str;
|
||||
|
||||
while(size>0)
|
||||
{
|
||||
if(!(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
--size;
|
||||
return count;
|
||||
}
|
||||
|
||||
if(isspace(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
sp=p+1; ///<跳过分割符
|
||||
}
|
||||
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}//int SplitToStringList
|
||||
|
||||
/**
|
||||
* 以指定字符为分隔拆解一个字符串到一个字符串列表
|
||||
* @param sl 字符串列表处理类
|
||||
* @param str 字符串
|
||||
* @param size 字符串长度
|
||||
* @param split_char 分隔字符
|
||||
* @return 字符串行数
|
||||
*/
|
||||
template<typename T> int SplitToStringList(StringList<T> &sl,const T *str,int size,const T &split_char)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
int count=0;
|
||||
const T *p,*sp;
|
||||
|
||||
sp=p=str;
|
||||
|
||||
while(size>0)
|
||||
{
|
||||
if(!(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
--size;
|
||||
return count;
|
||||
}
|
||||
|
||||
if(*p==split_char)
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
sp=p+1; ///<跳过分割符
|
||||
}
|
||||
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}//int SplitToStringList
|
||||
|
||||
template<typename T> int SplitToStringListFromString(StringList<T> &sl,const String<T> &str,const T &split_char)
|
||||
{
|
||||
return SplitToStringList<T>(sl,str.c_str(),str.Length(),split_char);
|
||||
}
|
||||
|
||||
/**
|
||||
* 以指定字符为分隔拆解一个字符串到一个字符串列表
|
||||
* @param sl 字符串列表处理类
|
||||
* @param str 字符串
|
||||
* @param size 字符串长度
|
||||
* @param split_char 分隔字符
|
||||
* @param maxSize 最多执行次数
|
||||
* @return 字符串行数
|
||||
*/
|
||||
template<typename T> int SplitToStringList(StringList<T> &sl,const T *str,int size,const T &split_char,int maxSize)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
int count=0;
|
||||
const T *p,*sp;
|
||||
|
||||
sp=p=str;
|
||||
|
||||
while(size>0)
|
||||
{
|
||||
if(!(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
--size;
|
||||
return count;
|
||||
}
|
||||
|
||||
if(*p==split_char)
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
sp=p+1; ///<跳过分割符
|
||||
if(maxSize >0 && count >=maxSize-1)
|
||||
{
|
||||
++p;
|
||||
--size;
|
||||
if(size > 0)
|
||||
{
|
||||
sl.Add(String<T>(sp,size));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
}
|
||||
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}//int SplitToStringList
|
||||
|
||||
template<typename T> int SplitToStringList(StringList<T> &sl,const String<T> &str,const T &split_char,int maxSize)
|
||||
{
|
||||
return SplitToStringList<T>(sl,str.c_str(),str.Length(),split_char,maxSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* 拆解一个多行字符串到一个字符串列表
|
||||
* @param sl 字符串列表处理类
|
||||
* @param str 字符串
|
||||
* @param size 字符串长度
|
||||
* @return 字符串行数
|
||||
*/
|
||||
template<typename T> int SplitToStringListByEnter(StringList<T> &sl,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
|
||||
int count=0;
|
||||
const T *p,*sp;
|
||||
|
||||
sp=p=str;
|
||||
|
||||
while(size>0)
|
||||
{
|
||||
if(!(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
--size;
|
||||
return count;
|
||||
}
|
||||
|
||||
if(*p==0x0D) // \r
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
|
||||
++p;
|
||||
--size;
|
||||
|
||||
if(*p==0x0A) // \r\n,Windows下的断行是(\r\n)0x0D+0x0A,而其它系统是仅有一个
|
||||
{
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
|
||||
sp=p;
|
||||
}
|
||||
else
|
||||
if(*p==0x0A) // \n
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
|
||||
++p;
|
||||
--size;
|
||||
|
||||
sp=p;
|
||||
}
|
||||
else
|
||||
{
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
}
|
||||
|
||||
if(p>sp)
|
||||
{
|
||||
sl.Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}//int SplitToStringList
|
||||
|
||||
template<typename T> int SplitToStringListByEnter(StringList<T> &sl,const String<T> &str)
|
||||
{
|
||||
return SplitToStringListByEnter<T>(sl,str.c_str(),str.Length());
|
||||
}
|
||||
|
||||
template<typename T> int SplitToStringList(StringList<T> &sl,const String<T> &str)
|
||||
{
|
||||
return SplitToStringList<T>(sl,str.c_str(),str.Length());
|
||||
}
|
||||
|
||||
/**
|
||||
* 拆解一个多行字符串到多个字符串列表
|
||||
* @param sl 字符串列表处理类
|
||||
* @param slc 字符串列表处理类个数
|
||||
* @param str 字符串
|
||||
* @param size 字符串长度
|
||||
* @return 字符串行数
|
||||
*/
|
||||
template<typename T> int SplitToMultiStringList(StringList<T> **sl,int slc,const T *str,int size)
|
||||
{
|
||||
if(!str||size<=0)return(-1);
|
||||
if(slc<=0)return(-1);
|
||||
|
||||
int index=0;
|
||||
int count=0;
|
||||
const T *p,*sp;
|
||||
|
||||
sp=p=str;
|
||||
|
||||
while(size>0)
|
||||
{
|
||||
if(!(*p))
|
||||
{
|
||||
if(p>sp)
|
||||
{
|
||||
sl[index]->Add(String<T>(sp,p-sp));
|
||||
if(++index==slc)index=0;
|
||||
++count;
|
||||
}
|
||||
|
||||
--size;
|
||||
return count;
|
||||
}
|
||||
|
||||
if(*p==0x0D) // \r
|
||||
{
|
||||
sl[index]->Add(String<T>(sp,p-sp));
|
||||
if(++index==slc)index=0;
|
||||
|
||||
++count;
|
||||
|
||||
++p;
|
||||
--size;
|
||||
|
||||
if(*p==0x0A) // \r\n,Windows下的断行是(\r\n)0x0D+0x0A,而其它系统是仅有一个
|
||||
{
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
|
||||
sp=p;
|
||||
}
|
||||
else
|
||||
if(*p==0x0A) // \n
|
||||
{
|
||||
sl[index]->Add(String<T>(sp,p-sp));
|
||||
if(++index==slc)index=0;
|
||||
|
||||
++count;
|
||||
|
||||
++p;
|
||||
--size;
|
||||
|
||||
sp=p;
|
||||
}
|
||||
else
|
||||
{
|
||||
++p;
|
||||
--size;
|
||||
}
|
||||
}
|
||||
|
||||
if(p>sp)
|
||||
{
|
||||
sl[index]->Add(String<T>(sp,p-sp));
|
||||
++count;
|
||||
}
|
||||
|
||||
return count;
|
||||
}//int SplitToStringList
|
||||
|
||||
template<typename T> int SplitToMultiStringList(StringList<T> **sl,int slc,const String<T> &str)
|
||||
{
|
||||
if(!sl||slc<=0)return(false);
|
||||
|
||||
if(slc==1)
|
||||
return SplitToStringList<T>(**sl,str.c_str(),str.Length());
|
||||
else
|
||||
return SplitToMultiStringList<T>(sl,slc,str.c_str(),str.Length());
|
||||
}
|
||||
|
||||
/**
|
||||
* 将一个字符串列表整合成一个字符串
|
||||
* @param sl 要整合的字符串列表
|
||||
* @param end_line 换行符
|
||||
* @return 字符串
|
||||
*/
|
||||
template<typename T> String<T> ToString(const StringList<T> &sl,const String<T> &end_line)
|
||||
{
|
||||
int total_chars=0;
|
||||
|
||||
const int line=sl.GetCount();
|
||||
String<T> **sp=sl.GetDataList();
|
||||
|
||||
for(int i=0;i<line;i++)
|
||||
{
|
||||
total_chars+=(*sp)->Length();
|
||||
|
||||
++sp;
|
||||
}
|
||||
|
||||
total_chars+=line*end_line.Length();
|
||||
|
||||
T *str=new T[total_chars+1];
|
||||
T *tp=str;
|
||||
|
||||
sp=sl.GetDataList();
|
||||
for(int i=0;i<line;i++)
|
||||
{
|
||||
hgl_cpy(tp,(*sp)->c_str(),(*sp)->Length());
|
||||
tp+=(*sp)->Length();
|
||||
hgl_cpy(tp,end_line.c_str(),end_line.Length());
|
||||
tp+=end_line.Length();
|
||||
|
||||
++sp;
|
||||
}
|
||||
|
||||
str[total_chars]=0;
|
||||
return String<T>::newOf(str,total_chars);
|
||||
}
|
||||
template<typename T> String<T> StringList<T>::NullString; ///<空字符串实例
|
||||
|
||||
#define DEFINE_STRING_LIST(name) using name##StringList=StringList<name##String::CharType>;
|
||||
|
||||
|
@@ -58,6 +58,8 @@ SOURCE_GROUP("Datatype\\Color\\Source Files" FILES ${COLOR_SOURCE_FILES})
|
||||
SET(STRING_HEADER_FILES ${TYPE_INCLUDE_PATH}/String.h
|
||||
${TYPE_INCLUDE_PATH}/StringInstance.h
|
||||
${TYPE_INCLUDE_PATH}/StringList.h
|
||||
${TYPE_INCLUDE_PATH}/SplitString.h
|
||||
${TYPE_INCLUDE_PATH}/MergeString.h
|
||||
${TYPE_INCLUDE_PATH}/StdString.h)
|
||||
|
||||
SET(TEXT_HEADER_FILES ${CMCORE_ROOT_INCLUDE_PATH}/hgl/Endian.h
|
||||
|
Reference in New Issue
Block a user