增加Array.Expand,控制数组是否可扩容。

字符串增加一个构造函数,允许外部设定一个缓冲区且不可扩容,适用于令牌配置。
初步测试通过
This commit is contained in:
nnhy 2016-06-04 11:09:44 +00:00
parent e361c3fb17
commit fc3ee97f1e
9 changed files with 33 additions and 14 deletions

View File

@ -43,6 +43,7 @@ void Array::move(Array& rval)
_Capacity = rval._Capacity; _Capacity = rval._Capacity;
_needFree = rval._needFree; _needFree = rval._needFree;
_canWrite = rval._canWrite; _canWrite = rval._canWrite;
Expand = rval.Expand;
rval._Capacity = 0; rval._Capacity = 0;
rval._needFree = false; rval._needFree = false;
@ -51,6 +52,7 @@ void Array::move(Array& rval)
void Array::Init() void Array::Init()
{ {
Expand = true;
_Size = 1; _Size = 1;
_Capacity = _Length; _Capacity = _Length;
@ -276,6 +278,8 @@ bool Array::CheckCapacity(int len, int bak)
// 是否超出容量 // 是否超出容量
// 如果不是可写,在扩容检查时,也要进行扩容,避免内部不可写数据被修改 // 如果不是可写,在扩容检查时,也要进行扩容,避免内部不可写数据被修改
if(_Arr && len <= _Capacity && _canWrite) return true; if(_Arr && len <= _Capacity && _canWrite) return true;
// 是否可以扩容
if(!Expand) return false;
// 自动计算合适的容量 // 自动计算合适的容量
int sz = 0x40; int sz = 0x40;

View File

@ -7,6 +7,8 @@
class Array : public Buffer class Array : public Buffer
{ {
public: public:
bool Expand; // 是否可扩容
// 数组最大容量。初始化时决定,后面不允许改变 // 数组最大容量。初始化时决定,后面不允许改变
inline int Capacity() const { return _Capacity; } inline int Capacity() const { return _Capacity; }

View File

@ -14,8 +14,9 @@ public:
String(cstring cstr = ""); String(cstring cstr = "");
String(const String& str); String(const String& str);
String(String&& rval); String(String&& rval);
// 外部传入缓冲区供内部使用,注意长度减去零结束符 // 外部传入缓冲区供内部使用,内部计算字符串长度,注意长度减去零结束符
String(char* str, int length); String(char* str, int length);
String(char* str, int length, bool expand);
// 包装静态字符串,直接使用,修改时扩容 // 包装静态字符串,直接使用,修改时扩容
String(cstring str, int length); String(cstring str, int length);
explicit String(char c); explicit String(char c);

View File

@ -120,15 +120,23 @@ String::String(double value, byte decimalPlaces) : Array(Arr, ArrayLength(Arr))
//dtostrf(value, (decimalPlaces + 2), decimalPlaces, _Arr); //dtostrf(value, (decimalPlaces + 2), decimalPlaces, _Arr);
} }
// 外部传入缓冲区供内部使用,注意长度减去零结束符 // 外部传入缓冲区供内部使用,内部计算字符串长度,注意长度减去零结束符
String::String(char* str, int length) : Array(str, length) String::String(char* str, int length) : Array(str, length)
{ {
//init(); _Arr = str;
_Arr = str;
_Capacity = length - 1; _Capacity = length - 1;
_Length = 0;
_Arr[0] = '\0'; // 计算外部字符串长度
int len = strlen(str);
if(len >= length) len = length - 1;
_Length = len;
_Arr[_Length] = '\0';
}
// 外部传入缓冲区供内部使用,内部计算字符串长度,注意长度减去零结束符
String::String(char* str, int length, bool expand) : String(str, length)
{
Expand = expand;
} }
// 包装静态字符串,直接使用,修改时扩容 // 包装静态字符串,直接使用,修改时扩容

View File

@ -36,6 +36,7 @@ void Object::Show(bool newLine) const
// 为了减少堆分配,采用较大的栈缓冲区 // 为了减少堆分配,采用较大的栈缓冲区
char cs[0x200]; char cs[0x200];
String str(cs, ArrayLength(cs)); String str(cs, ArrayLength(cs));
str.SetLength(0);
ToStr(str); ToStr(str);
str.Show(newLine); str.Show(newLine);
} }

View File

@ -50,7 +50,7 @@ public:
// 收到数据 // 收到数据
virtual void OnProcess(const Buffer& bs, const IPEndPoint& remote); virtual void OnProcess(const Buffer& bs, const IPEndPoint& remote);
protected: protected:
bool SendData(const String& cmd, const Buffer& bs); bool SendData(const String& cmd, const Buffer& bs);
}; };

View File

@ -54,7 +54,9 @@ TokenConfig* TokenConfig::Create(cstring vendor, ProtocolType protocol, ushort s
tc.Init(); tc.Init();
tc.Protocol = protocol; tc.Protocol = protocol;
tc.Load(); tc.Load();
if(tc.Protocol == 0x00)tc.Protocol = ProtocolType::Udp; // 默认 UDP 不允许 unknown
// 默认 UDP 不允许 unknown
if(tc.Protocol == 0x00) tc.Protocol = ProtocolType::Udp;
bool rs = tc.New; bool rs = tc.New;
auto vnd = tc.Vendor(); auto vnd = tc.Vendor();

View File

@ -36,11 +36,11 @@ public:
virtual void Init(); virtual void Init();
virtual void Show() const; virtual void Show() const;
String User() { return String(_User); } String User() { return String(_User, sizeof(_User), false); }
String Pass() { return String(_Pass); } String Pass() { return String(_Pass, sizeof(_Pass), false); }
String Token() { return String(_Token); } String Token() { return String(_Token, sizeof(_Token), false); }
String Server() { return String(_Server); } String Server() { return String(_Server, sizeof(_Server), false); }
String Vendor() { return String(_Vendor); } String Vendor() { return String(_Vendor, sizeof(_Vendor), false); }
static TokenConfig* Current; static TokenConfig* Current;
static TokenConfig* Create(cstring vendor, ProtocolType protocol, ushort sport, ushort port); static TokenConfig* Create(cstring vendor, ProtocolType protocol, ushort sport, ushort port);

View File

@ -589,6 +589,7 @@ void StatTask(void* param)
char cs[128]; char cs[128];
String str(cs, ArrayLength(cs)); String str(cs, ArrayLength(cs));
str.SetLength(0);
st->ToStr(str); st->ToStr(str);
str.Show(true); str.Show(true);