00001
00002
00003 #ifndef VGS_ByteBuffer_H
00004 #define VGS_ByteBuffer_H
00005
00006 #include <stdlib.h>
00007 #include <assert.h>
00008
00009 #include <string>
00010
00011 namespace VGServer {
00012
00018 class ByteBuffer
00019 {
00020 protected:
00022 char *_data;
00023
00025 size_t _size;
00026
00028 size_t _buff;
00029
00030 public:
00032 explicit inline ByteBuffer() {
00033 _data = NULL;
00034 _size = _buff = 0;
00035 }
00036
00038 explicit inline ByteBuffer(size_t n) {
00039 _data = NULL;
00040 _size = _buff = 0;
00041 alloc(n);
00042 }
00043
00045 explicit inline ByteBuffer(const ByteBuffer &o) {
00046 _data = NULL;
00047 _size = _buff = 0;
00048 assign_copy(o.data(), o.size());
00049 }
00050
00052 inline ByteBuffer& operator=(const ByteBuffer &o) {
00053 assign_copy(o.data(), o.size());
00054 return *this;
00055 }
00056
00058 virtual ~ByteBuffer() {
00059 dealloc();
00060 }
00061
00063 inline const char *data() const
00064 { return _data; }
00065
00067 inline char *data()
00068 { return _data; }
00069
00071 inline size_t size() const
00072 { return _size; }
00073
00075 inline size_t buffsize() const
00076 { return _buff; }
00077
00079 inline bool empty() const
00080 { return size() == 0; }
00081
00083 inline void set_size(size_t s)
00084 { assert(s <= _buff); _size = s; }
00085
00087 inline operator std::string() const
00088 { return std::string(_data, _size); }
00089
00091 inline std::string toString() const
00092 { return std::string(_data, _size); }
00093
00095 inline void clear()
00096 { _size = 0; }
00097
00101 virtual void alloc(size_t n)
00102 {
00103 if (_size < n)
00104 {
00105 _size = _buff = n;
00106 _data = static_cast<char*>(realloc(_data, _size));
00107 }
00108 }
00109
00113 virtual void grow(size_t n)
00114 {
00115 if (_buff < n)
00116 {
00117
00118 while(_buff < n) {
00119 if (_buff < 256) _buff = 512;
00120 else if (_buff < 1024*1024) _buff = 2*_buff;
00121 else _buff += 1024*1024;
00122 }
00123
00124 _data = static_cast<char*>(realloc(_data, _buff));
00125 }
00126 }
00127
00130 inline void dealloc()
00131 {
00132 if (_data) free(_data);
00133 _data = NULL;
00134 _size = _buff = 0;
00135 }
00136
00138 inline const char *detach() {
00139 const char *data = _data;
00140 _data = NULL;
00141 _size = _buff = 0;
00142 return data;
00143 }
00144
00147 inline std::pair<const char*, size_t> detach_pair()
00148 {
00149 std::pair<const char*, size_t> pair(_data, _size);
00150 _data = NULL;
00151 _size = 0;
00152 return pair;
00153 }
00154
00157 inline void assign_keep(void *data, size_t len)
00158 {
00159 dealloc();
00160 _data = static_cast<char*>(data);
00161 _size = _buff = len;
00162 }
00163
00165 inline void assign_copy(const void *data, size_t len)
00166 {
00167 if (_buff < len) alloc(len);
00168
00169 memcpy(_data, data, len);
00170 _size = len;
00171 }
00172 };
00173
00174 }
00175
00176 #endif // VGS_ByteBuffer_H