包含gstring(泛型字符串类)以及它的派生ustring(宽字符类).
现在贴出来晒晒,改天把case也贴出来下,不过肯定会存在bug的。
而且只实现了一些必须的功能。
#ifndef STRING__
#define STRING__
#include " array.h "
namespace adt
{
using adt::array;
template<typename VType,VType VTerm_>
class gstring
{
protected:
protected:
array<VType> buf;
int lenof(VType * copy)
{
if(!copy)return 0;
int i=0;
for(;copy[i]!=VTerm_;i++);
return i;
}
public:
int len;
int set(VType* copy,int l=-1)
{
if(!copy)
buf.renew(0);
if(l==-1||l<=0)
l=lenof(copy);
buf.set(copy,l+1,0,l+1);
buf.set(l,VTerm_);
len=l;
return 1;
}
gstring()
{
buf.renew(1);
buf.set(0,VTerm_);
buf.n_=0;
len=0;
}
gstring(VType * copy,int l=-1)
{
set(copy,l);
}
gstring(gstring & str)
{
set(str.buf(),str.len);
}
int add(VType * copy,int l=-1)
{
if(!copy)return 0;
if(l==-1||l<=0)
{
l=lenof(copy);
}
buf.extra(l);
l+=len+1;
for(int i=len;i!=l;i++)
{
buf.set(i,copy[i-len]);
}
len=l-1;
return 1;
}
gstring& copyFrom(VType * _src,int _begin,int _len)
{
set(_src+_begin,_len);
return *this;
}
gstring& operator = (VType* copy)
{
buf.renew(1);
buf.set(0,VTerm_);
buf.n_=0;
len=0;
add(copy);
return *this;
}
gstring& operator = (gstring & copy)
{
set(copy.buf(),copy.len);
return *this;
}
int operator == (gstring & rvalue)
{
if(len!=rvalue.len)
return 0;
for(int i=0;i!=len;i++)
if(rvalue.buf[i]!=buf[i])
return 0;
return 1;
}
int operator == (VType * rvalue)
{
int i=0;
for(;rvalue[i]!=VTerm_&&buf[i]!=VTerm_;i++)
{
if(rvalue[i]!=buf[i])
return 0;
}
if(rvalue[i]!=VTerm_||buf[i]!=VTerm_)
return 0;
return 1;
}
VType& operator [](int i)
{
return buf[i];
}
int operator != (gstring & rvalue)
{
if(len!=rvalue.len)
return 1;
for(int i=0;i!=len;i++)
if(rvalue.buf[i]!=buf[i])
return 1;
return 0;
}
int add(gstring & copy)
{
add(copy.buf(),copy.len);
return 1;
}
int mul(VType * copy,int factor,int l=-1)
{
if(!copy||factor<=0)return 0;
if(l==-1||l<=0)
{
l=lenof(copy);
}
buf.extra(factor*l);
for(int i=0;i!=factor;i++)
add(copy,l);
return 1;
}
int mul(gstring & copy,int factor)
{
if(factor<=0)return 0;
buf.extra(factor*copy.len);
for(int i=0;i!=factor;i++)
add(copy.buf(),copy.len);
return 1;
}
VType* operator()()
{
return buf();
}
};
class ustring:public gstring<wchar_t,L'\0'>
{
public:
ustring():gstring()
{
}
ustring(wchar_t * copy,int l=-1):gstring( copy, l )
{
}
ustring(gstring<wchar_t,L'\0'> & str):gstring( str)
{
}
ustring& operator <<(double i)
{
wchar_t t[50];
atom::d2s(t,i);
add(t);
return *this;
}
ustring& operator <<(int i)
{
wchar_t t[50];
atom::d2s(t,i);
add(t);
return *this;
}
ustring& operator <<(wchar_t t_[])
{
add(t_);
return *this;
}
ustring& operator <<(char t_[])
{
wchar_t t[50];
int i=0;
for(;t_[i]!=0;i++)
t[i]=t_[i];
t[i]=t_[i];
add(t);
return *this;
}
ustring& operator <<(bool t)
{
if(t==true)
add(L"true");
else
add(L"false");
return *this;
}
};
class string:public gstring<char,'\0'>
{
public:
string():gstring()
{
}
string(char * copy,int l=-1):gstring( copy, l )
{
}
string(gstring<char,'\0'> & str):gstring( str)
{
}
string& operator <<(double i)
{
char t[50];
atom::d2s(t,i);
add(t);
return *this;
}
string& operator <<(int i)
{
char t[50];
atom::d2s(t,i);
add(t);
return *this;
}
string& operator <<(wchar_t t_[])
{
char t[50];
int i=0;
for(;t_[i]!=0;i++)
t[i]=t_[i];
t[i]=t_[i];
add(t);
return *this;
}
string& operator <<(char t_[])
{
add(t_);
return *this;
}
string& operator <<(char t_)
{
char _temp[2]={t_,0};
add(_temp);
return *this;
}
string& operator <<(bool t)
{
if(t==true)
add("true");
else
add("false");
return *this;
}
};
}
#endif
#define STRING__
#include " array.h "
namespace adt
{
using adt::array;
template<typename VType,VType VTerm_>
class gstring
{
protected:
protected:
array<VType> buf;
int lenof(VType * copy)
{
if(!copy)return 0;
int i=0;
for(;copy[i]!=VTerm_;i++);
return i;
}
public:
int len;
int set(VType* copy,int l=-1)
{
if(!copy)
buf.renew(0);
if(l==-1||l<=0)
l=lenof(copy);
buf.set(copy,l+1,0,l+1);
buf.set(l,VTerm_);
len=l;
return 1;
}
gstring()
{
buf.renew(1);
buf.set(0,VTerm_);
buf.n_=0;
len=0;
}
gstring(VType * copy,int l=-1)
{
set(copy,l);
}
gstring(gstring & str)
{
set(str.buf(),str.len);
}
int add(VType * copy,int l=-1)
{
if(!copy)return 0;
if(l==-1||l<=0)
{
l=lenof(copy);
}
buf.extra(l);
l+=len+1;
for(int i=len;i!=l;i++)
{
buf.set(i,copy[i-len]);
}
len=l-1;
return 1;
}
gstring& copyFrom(VType * _src,int _begin,int _len)
{
set(_src+_begin,_len);
return *this;
}
gstring& operator = (VType* copy)
{
buf.renew(1);
buf.set(0,VTerm_);
buf.n_=0;
len=0;
add(copy);
return *this;
}
gstring& operator = (gstring & copy)
{
set(copy.buf(),copy.len);
return *this;
}
int operator == (gstring & rvalue)
{
if(len!=rvalue.len)
return 0;
for(int i=0;i!=len;i++)
if(rvalue.buf[i]!=buf[i])
return 0;
return 1;
}
int operator == (VType * rvalue)
{
int i=0;
for(;rvalue[i]!=VTerm_&&buf[i]!=VTerm_;i++)
{
if(rvalue[i]!=buf[i])
return 0;
}
if(rvalue[i]!=VTerm_||buf[i]!=VTerm_)
return 0;
return 1;
}
VType& operator [](int i)
{
return buf[i];
}
int operator != (gstring & rvalue)
{
if(len!=rvalue.len)
return 1;
for(int i=0;i!=len;i++)
if(rvalue.buf[i]!=buf[i])
return 1;
return 0;
}
int add(gstring & copy)
{
add(copy.buf(),copy.len);
return 1;
}
int mul(VType * copy,int factor,int l=-1)
{
if(!copy||factor<=0)return 0;
if(l==-1||l<=0)
{
l=lenof(copy);
}
buf.extra(factor*l);
for(int i=0;i!=factor;i++)
add(copy,l);
return 1;
}
int mul(gstring & copy,int factor)
{
if(factor<=0)return 0;
buf.extra(factor*copy.len);
for(int i=0;i!=factor;i++)
add(copy.buf(),copy.len);
return 1;
}
VType* operator()()
{
return buf();
}
};
class ustring:public gstring<wchar_t,L'\0'>
{
public:
ustring():gstring()
{
}
ustring(wchar_t * copy,int l=-1):gstring( copy, l )
{
}
ustring(gstring<wchar_t,L'\0'> & str):gstring( str)
{
}
ustring& operator <<(double i)
{
wchar_t t[50];
atom::d2s(t,i);
add(t);
return *this;
}
ustring& operator <<(int i)
{
wchar_t t[50];
atom::d2s(t,i);
add(t);
return *this;
}
ustring& operator <<(wchar_t t_[])
{
add(t_);
return *this;
}
ustring& operator <<(char t_[])
{
wchar_t t[50];
int i=0;
for(;t_[i]!=0;i++)
t[i]=t_[i];
t[i]=t_[i];
add(t);
return *this;
}
ustring& operator <<(bool t)
{
if(t==true)
add(L"true");
else
add(L"false");
return *this;
}
};
class string:public gstring<char,'\0'>
{
public:
string():gstring()
{
}
string(char * copy,int l=-1):gstring( copy, l )
{
}
string(gstring<char,'\0'> & str):gstring( str)
{
}
string& operator <<(double i)
{
char t[50];
atom::d2s(t,i);
add(t);
return *this;
}
string& operator <<(int i)
{
char t[50];
atom::d2s(t,i);
add(t);
return *this;
}
string& operator <<(wchar_t t_[])
{
char t[50];
int i=0;
for(;t_[i]!=0;i++)
t[i]=t_[i];
t[i]=t_[i];
add(t);
return *this;
}
string& operator <<(char t_[])
{
add(t_);
return *this;
}
string& operator <<(char t_)
{
char _temp[2]={t_,0};
add(_temp);
return *this;
}
string& operator <<(bool t)
{
if(t==true)
add("true");
else
add("false");
return *this;
}
};
}
#endif