增加布尔型到字符串的转换;

增加模板支持任意具有ToString方法的对象的连接
This commit is contained in:
大石头 2017-02-03 22:46:28 +08:00
parent 1e5255699f
commit 576ee29487
2 changed files with 23 additions and 142 deletions

View File

@ -19,6 +19,7 @@ public:
String(char* str, int length, bool expand);
// 包装静态字符串,直接使用,修改时扩容
String(cstring str, int length);
explicit String(bool value);
explicit String(char c);
explicit String(byte value, int radix = 10);
explicit String(short value, int radix = 10);
@ -29,13 +30,11 @@ public:
explicit String(UInt64 value, int radix = 10);
explicit String(float value, int decimalPlaces = 4);
explicit String(double value, int decimalPlaces = 8);
//virtual ~String();
using Array::SetLength;
using Array::Copy;
// 内存管理
//inline uint Length() const { return _Length; }
inline cstring GetBuffer() const { return (cstring)_Arr; }
// 设置数组长度。改变长度后确保最后以0结尾
virtual bool SetLength(int length, bool bak);
@ -57,6 +56,7 @@ public:
bool Concat(const Object& obj);
bool Concat(const String& str);
bool Concat(cstring cstr);
bool Concat(bool value);
bool Concat(char c);
bool Concat(byte c, int radix = 10);
bool Concat(short num, int radix = 10);
@ -68,31 +68,15 @@ public:
bool Concat(float num, int decimalPlaces = 4);
bool Concat(double num, int decimalPlaces = 8);
/*template<typename T>
String& operator += (T rhs) {Concat(rhs); return (*this);}*/
String& operator += (const Object& rhs) {Concat(rhs); return (*this);}
String& operator += (const String& rhs) {Concat(rhs); return (*this);}
String& operator += (cstring cstr) {Concat(cstr); return (*this);}
String& operator += (char c) {Concat(c); return (*this);}
String& operator += (byte num) {Concat(num); return (*this);}
String& operator += (int num) {Concat(num); return (*this);}
String& operator += (uint num) {Concat(num); return (*this);}
String& operator += (Int64 num) {Concat(num); return (*this);}
String& operator += (UInt64 num) {Concat(num); return (*this);}
String& operator += (float num) {Concat(num); return (*this);}
String& operator += (double num) {Concat(num); return (*this);}
// 模版连接可连接任何带有ToString方法的对象
template<class T>
bool Concat(const T& rhs) { return Concat(rhs.ToString()); }
friend String& operator + (String& lhs, const Object& rhs);
friend String& operator + (String& lhs, const String& rhs);
friend String& operator + (String& lhs, cstring cstr);
friend String& operator + (String& lhs, char c);
friend String& operator + (String& lhs, byte num);
friend String& operator + (String& lhs, int num);
friend String& operator + (String& lhs, uint num);
friend String& operator + (String& lhs, Int64 num);
friend String& operator + (String& lhs, UInt64 num);
friend String& operator + (String& lhs, float num);
friend String& operator + (String& lhs, double num);
// 重载字符串连接运算符
template<class T>
String& operator += (const T& rhs) { Concat(rhs); return (*this); }
template<class T>
friend String& operator + (String& lhs, const T& rhs) { lhs.Concat(rhs); return lhs; }
explicit operator bool() const { return _Length > 0; }
bool operator !() const { return _Length == 0; }
@ -128,8 +112,6 @@ public:
virtual String& ToStr(String& str) const;
// 输出对象的字符串表示方式
virtual String ToString() const;
//// 清空已存储数据。
//virtual void Clear();
// 调试输出字符串
virtual void Show(bool newLine = false) const;
@ -172,12 +154,6 @@ public:
#endif
private:
//char* _Arr; // 字符数组
//int _Capacity; // 容量不包含0结束符
//int _Length; // 字符串长度不包含0结束符
//bool _needFree; // 是否需要释放
//bool _canWrite; // 是否可写
char Arr[0x40];
void init();

View File

@ -51,6 +51,13 @@ String::String(String&& rval) : Array(Arr, ArrayLength(Arr))
move(rval);
}
String::String(bool value) : Array(Arr, ArrayLength(Arr))
{
init();
Concat(value);
}
String::String(char c) : Array(Arr, ArrayLength(Arr))
{
init();
@ -240,18 +247,6 @@ bool String::CopyOrWrite()
return false;
}
/*void String::SetBuffer(const void* str, int length)
{
release();
_Arr = (char*)str;
_Capacity = length;
_Length = 0;
_needFree = false;
_canWrite = false;
}*/
bool String::SetLength(int len, bool bak)
{
//if(!Array::SetLength(length, bak)) return false;
@ -283,17 +278,6 @@ int String::Copy(int destIndex, const void* src, int len)
return rs;
}
/*// 拷贝数据,默认-1长度表示两者最小长度
int String::Copy(int destIndex, const Buffer& src, int srcIndex, int len)
{
int rs = Buffer::Copy(destIndex, src, srcIndex, len);
if(!rs) return 0;
_Arr[_Length] = '\0';
return rs;
}*/
// 把数据复制到目标缓冲区,默认-1长度表示当前长度
int String::CopyTo(int srcIndex, void* dest, int len) const
{
@ -361,6 +345,11 @@ bool String::Concat(cstring cstr)
return Concat(cstr, strlen(cstr));
}
bool String::Concat(bool value)
{
return Concat(value ? "true" : "false");
}
bool String::Concat(char c)
{
if (!CheckCapacity(_Length + 1)) return false;
@ -505,84 +494,6 @@ bool String::Concat(double num, int decimalPlaces)
return Concat(buf, strlen(buf));
}
String& operator + (String& lhs, const Object& rhs)
{
auto& a = const_cast<String&>(lhs);
auto str = rhs.ToString();
if (!a.Concat(str._Arr, str._Length)) a.release();
return a;
}
String& operator + (String& lhs, const String& rhs)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(rhs._Arr, rhs._Length)) a.release();
return a;
}
String& operator + (String& lhs, cstring cstr)
{
auto& a = const_cast<String&>(lhs);
if (!cstr || !a.Concat(cstr, strlen(cstr))) a.release();
return a;
}
String& operator + (String& lhs, char c)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(c)) a.release();
return a;
}
String& operator + (String& lhs, byte num)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(num)) a.release();
return a;
}
String& operator + (String& lhs, int num)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(num)) a.release();
return a;
}
String& operator + (String& lhs, uint num)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(num)) a.release();
return a;
}
String& operator + (String& lhs, Int64 num)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(num)) a.release();
return a;
}
String& operator + (String& lhs, UInt64 num)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(num)) a.release();
return a;
}
String& operator + (String& lhs, float num)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(num)) a.release();
return a;
}
String& operator + (String& lhs, double num)
{
auto& a = const_cast<String&>(lhs);
if (!a.Concat(num)) a.release();
return a;
}
int String::CompareTo(const String& s) const
{
return CompareTo(s._Arr, s._Length, false);
@ -783,12 +694,6 @@ String String::ToString() const
return *this;
}
/*// 清空已存储数据。
void String::Clear()
{
release();
}*/
// 调试输出字符串
void String::Show(bool newLine) const
{