ByteBuffer.h

Go to the documentation of this file.
00001 // $Id: ByteBuffer.h 130 2006-05-14 17:11:25Z bingmann $
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             // place to adapt the buffer growing algorithm as need.
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 } // namespace VGServer
00175 
00176 #endif // VGS_ByteBuffer_H

Generated on Wed Sep 27 14:34:00 2006 for VGServer by  doxygen 1.4.7