added SplitString.h and MergeString.h

This commit is contained in:
2022-08-04 21:35:30 +08:00
parent 01a3f3da25
commit c1893a83ec
4 changed files with 497 additions and 408 deletions

View 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
View 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

View File

@@ -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>;

View File

@@ -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