tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

DynamicBuffer.h (1428B)


      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