Home | History | Annotate | Download | only in Common
      1 // Common/DynamicBuffer.h
      2 
      3 #ifndef __COMMON_DYNAMIC_BUFFER_H
      4 #define __COMMON_DYNAMIC_BUFFER_H
      5 
      6 template <class T> class CDynamicBuffer
      7 {
      8   T *_items;
      9   size_t _size;
     10   size_t _pos;
     11 
     12   CDynamicBuffer(const CDynamicBuffer &buffer);
     13   void operator=(const CDynamicBuffer &buffer);
     14 
     15   void Grow(size_t size)
     16   {
     17     size_t delta = _size >= 64 ? _size : 64;
     18     if (delta < size)
     19       delta = size;
     20     size_t newCap = _size + delta;
     21     if (newCap < delta)
     22     {
     23       newCap = _size + size;
     24       if (newCap < size)
     25         throw 20120116;
     26     }
     27 
     28     T *newBuffer = new T[newCap];
     29     if (_pos != 0)
     30       memcpy(newBuffer, _items, _pos * sizeof(T));
     31     delete []_items;
     32     _items = newBuffer;
     33     _size = newCap;
     34   }
     35 
     36 public:
     37   CDynamicBuffer(): _items(0), _size(0), _pos(0) {}
     38   // operator T *() { return _items; }
     39   operator const T *() const { return _items; }
     40   ~CDynamicBuffer() { delete []_items; }
     41 
     42   T *GetCurPtrAndGrow(size_t addSize)
     43   {
     44     size_t rem = _size - _pos;
     45     if (rem < addSize)
     46       Grow(addSize - rem);
     47     T *res = _items + _pos;
     48     _pos += addSize;
     49     return res;
     50   }
     51 
     52   void AddData(const T *data, size_t size)
     53   {
     54     memcpy(GetCurPtrAndGrow(size), data, size * sizeof(T));
     55   }
     56 
     57   const size_t GetPos() const { return _pos; }
     58 
     59   // void Empty() { _pos = 0; }
     60 };
     61 
     62 typedef CDynamicBuffer<unsigned char> CByteDynamicBuffer;
     63 
     64 #endif
     65