5
* cstring - a simple string class
7
* the key difference between this and std::string is that the string
8
* is stored with a null terminator, providing an efficient c_str()
21
cstring() : _len(0), _data(0) {}
22
cstring(int l, const char *d=0) : _len(l) {
23
_data = new char[_len + 1];
28
cstring(const char *s) {
31
_data = new char[_len + 1];
32
memcpy(_data, s, _len);
39
cstring(const string &s) {
41
_data = new char[_len + 1];
42
memcpy(_data, s.data(), _len);
45
cstring(const cstring &s) {
47
_data = new char[_len + 1];
48
memcpy(_data, s.data(), _len);
52
if (_data) delete[] _data;
56
int length() const { return _len; }
57
bool empty() const { return _len == 0; }
58
char *c_str() const { return _data; }
59
char *data() const { return _data; }
61
//const char *operator() const { return _data; }
64
const cstring& operator=(const char *s) {
65
if (_data) delete[] _data;
67
_data = new char[_len + 1];
68
memcpy(_data, s, _len);
72
const cstring& operator=(const string &s) {
73
if (_data) delete[] _data;
75
_data = new char[_len + 1];
76
memcpy(_data, s.data(), _len);
80
const cstring& operator=(const cstring &ns) {
81
if (_data) delete[] _data;
83
_data = new char[_len + 1];
84
memcpy(_data, ns.data(), _len);
88
char &operator[](int n) {
92
void swap(cstring &other) {
107
void encode(bufferlist &bl) const {
110
bl.append(_data, _len);
112
void decode(bufferlist::iterator &bl) {
115
decode_nohead(l, bl);
117
void decode_nohead(int l, bufferlist::iterator& bl) {
118
if (_data) delete[] _data;
120
_data = new char[_len + 1];
121
bl.copy(_len, _data);
125
WRITE_CLASS_ENCODER(cstring)
127
inline void encode_nohead(const cstring& s, bufferlist& bl)
129
bl.append(s.data(), s.length());
131
inline void decode_nohead(int len, cstring& s, bufferlist::iterator& p)
133
s.decode_nohead(len, p);