SmartOS/Core/SString.h

210 lines
7.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __String_H__
#define __String_H__
#include "Array.h"
#include "ByteArray.h"
// 字符串助手,主要用于字符串连接
class StringSplit;
// 字符串
class String : public Array
{
public:
String(cstring cstr = "");
String(const String& str);
String(String&& rval);
// 外部传入缓冲区供内部使用,内部计算字符串长度,注意长度减去零结束符
String(char* str, int length);
String(char* str, int length, bool expand);
// 包装静态字符串,直接使用,修改时扩容
String(cstring str, int length);
explicit String(char c);
explicit String(byte value, int radix = 10);
explicit String(short value, int radix = 10);
explicit String(ushort value, int radix = 10);
explicit String(int value, int radix = 10);
explicit String(uint value, int radix = 10);
explicit String(Int64 value, int radix = 10);
explicit String(UInt64 value, int radix = 10);
explicit String(float value, byte decimalPlaces = 2);
explicit String(double value, byte decimalPlaces = 2);
//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);
// 拷贝数据,默认-1长度表示当前长度
virtual int Copy(int destIndex, const void* src, int len);
// 拷贝数据,默认-1长度表示两者最小长度
//virtual int Copy(int destIndex, const Buffer& src, int srcIndex, int len);
// 把数据复制到目标缓冲区,默认-1长度表示当前长度
virtual int CopyTo(int srcIndex, void* dest, int len) const;
// 为被赋值对象建立一个备份。
// 如果值为空或无效,或者内存分配失败,字符串将会被标记为无效
String& operator = (const String& rhs);
String& operator = (cstring cstr);
String& operator = (String&& rval);
// 连接内建类型。如果参数无效则认为连接失败
bool Concat(const Object& obj);
bool Concat(const String& str);
bool Concat(cstring cstr);
bool Concat(char c);
bool Concat(byte c, int radix = 10);
bool Concat(short num, int radix = 10);
bool Concat(ushort num, int radix = 10);
bool Concat(int num, int radix = 10);
bool Concat(uint num, int radix = 10);
bool Concat(Int64 num, int radix = 10);
bool Concat(UInt64 num, int radix = 10);
bool Concat(float num, byte decimalPlaces = 2);
bool Concat(double num, byte decimalPlaces = 2);
/*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);}
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);
explicit operator bool() const { return _Length > 0; }
bool operator !() const { return _Length == 0; }
//operator char*() const { return _Arr; }
int CompareTo(const String& s) const;
bool Equals(const String& s) const;
bool Equals(cstring cstr) const;
bool EqualsIgnoreCase(const String& s) const;
bool operator == (const String& rhs) const {return Equals(rhs);}
bool operator == (cstring cstr) const {return Equals(cstr);}
bool operator != (const String& rhs) const {return !Equals(rhs);}
bool operator != (cstring cstr) const {return !Equals(cstr);}
bool operator < (const String& rhs) const;
bool operator > (const String& rhs) const;
bool operator <= (const String& rhs) const;
bool operator >= (const String& rhs) const;
void SetAt(int index, char c);
char operator [] (int index) const;
char& operator [] (int index);
void GetBytes(byte* buf, int bufsize, int index=0) const;
ByteArray GetBytes() const;
ByteArray ToHex() const;
void ToArray(char* buf, int bufsize, int index=0) const { GetBytes((byte*)buf, bufsize, index); }
int ToInt() const;
float ToFloat() const;
// 输出对象的字符串表示方式
virtual String& ToStr(String& str) const;
// 输出对象的字符串表示方式
virtual String ToString() const;
//// 清空已存储数据。
//virtual void Clear();
// 调试输出字符串
virtual void Show(bool newLine = false) const;
// 格式化字符串,输出到现有字符串后面。方便我们连续格式化多个字符串
String& Format(cstring format, ...);
int IndexOf(const char ch, int startIndex = 0) const;
int IndexOf(const String& str, int startIndex = 0) const;
int IndexOf(cstring str, int startIndex = 0) const;
int LastIndexOf(const char ch, int startIndex = 0) const;
int LastIndexOf(const String& str, int startIndex = 0) const;
int LastIndexOf(cstring str, int startIndex = 0) const;
bool Contains(const String& str) const;
bool Contains(cstring str) const;
bool StartsWith(const String& str, int startIndex = 0) const;
bool StartsWith(cstring str, int startIndex = 0) const;
bool EndsWith(const String& str) const;
bool EndsWith(cstring str) const;
StringSplit Split(const String& sep) const;
String Substring(int start, int _Length) const;
String TrimStart() const;
String TrimEnd() const;
String Trim() const;
String Replace(char find, char replace) const;
String Replace(const String& find, const String& replace) const;
String Remove(int index) const;
String Remove(int index, int count) const;
String ToLower() const;
String ToUpper() const;
#if DEBUG
static void Test();
#endif
protected:
//char* _Arr; // 字符数组
//int _Capacity; // 容量不包含0结束符
//int _Length; // 字符串长度不包含0结束符
//bool _needFree; // 是否需要释放
//bool _canWrite; // 是否可写
char Arr[0x40];
protected:
void init();
void release();
bool Concat(cstring cstr, uint length);
String& copy(cstring cstr, uint length);
void move(String& rhs);
bool CopyOrWrite();
using Array::CheckCapacity;
bool CheckCapacity(uint size);
virtual void* Alloc(int len);
};
#define R(str) String(str)
class StringSplit
{
public:
StringSplit(const String& str, const String& sep);
const String Next();
explicit operator bool() const { return _Position >= 0; }
bool operator !() const { return _Position < 0; }
private:
const String& _Str;
const String& _Sep;
int _Position;
int _Length;
};
#endif