tor-browser

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

MyBuffer.h (5371B)


      1 // Common/MyBuffer.h
      2 
      3 #ifndef __COMMON_MY_BUFFER_H
      4 #define __COMMON_MY_BUFFER_H
      5 
      6 #include "Defs.h"
      7 
      8 /* 7-Zip now uses CBuffer only as CByteBuffer.
      9   So there is no need to use MY_ARRAY_NEW macro in CBuffer code. */
     10 
     11 template <class T> class CBuffer
     12 {
     13  T *_items;
     14  size_t _size;
     15 
     16 public:
     17  void Free()
     18  {
     19    if (_items)
     20    {
     21      delete []_items;
     22      _items = 0;
     23    }
     24    _size = 0;
     25  }
     26  
     27  CBuffer(): _items(0), _size(0) {};
     28  CBuffer(size_t size): _items(0), _size(0) { _items = new T[size]; _size = size; }
     29  CBuffer(const CBuffer &buffer): _items(0), _size(0)
     30  {
     31    size_t size = buffer._size;
     32    if (size != 0)
     33    {
     34      _items = new T[size];
     35      memcpy(_items, buffer._items, size * sizeof(T));
     36      _size = size;
     37    }
     38  }
     39 
     40  ~CBuffer() { delete []_items; }
     41 
     42  operator       T *()       { return _items; }
     43  operator const T *() const { return _items; }
     44  size_t Size() const { return _size; }
     45 
     46  void Alloc(size_t size)
     47  {
     48    if (size != _size)
     49    {
     50      Free();
     51      if (size != 0)
     52      {
     53        _items = new T[size];
     54        _size = size;
     55      }
     56    }
     57  }
     58 
     59  void AllocAtLeast(size_t size)
     60  {
     61    if (size > _size)
     62    {
     63      Free();
     64      _items = new T[size];
     65      _size = size;
     66    }
     67  }
     68 
     69  void CopyFrom(const T *data, size_t size)
     70  {
     71    Alloc(size);
     72    if (size != 0)
     73      memcpy(_items, data, size * sizeof(T));
     74  }
     75 
     76  void ChangeSize_KeepData(size_t newSize, size_t keepSize)
     77  {
     78    if (newSize == _size)
     79      return;
     80    T *newBuffer = NULL;
     81    if (newSize != 0)
     82    {
     83      newBuffer = new T[newSize];
     84      if (keepSize > _size)
     85        keepSize = _size;
     86      if (keepSize != 0)
     87        memcpy(newBuffer, _items, MyMin(keepSize, newSize) * sizeof(T));
     88    }
     89    delete []_items;
     90    _items = newBuffer;
     91    _size = newSize;
     92  }
     93 
     94  CBuffer& operator=(const CBuffer &buffer)
     95  {
     96    if (&buffer != this)
     97      CopyFrom(buffer, buffer._size);
     98    return *this;
     99  }
    100 };
    101 
    102 template <class T>
    103 bool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2)
    104 {
    105  size_t size1 = b1.Size();
    106  if (size1 != b2.Size())
    107    return false;
    108  if (size1 == 0)
    109    return true;
    110  return memcmp(b1, b2, size1 * sizeof(T)) == 0;
    111 }
    112 
    113 template <class T>
    114 bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2)
    115 {
    116  size_t size1 = b1.Size();
    117  if (size1 != b2.Size())
    118    return true;
    119  if (size1 == 0)
    120    return false;
    121  return memcmp(b1, b2, size1 * sizeof(T)) != 0;
    122 }
    123 
    124 
    125 // typedef CBuffer<char> CCharBuffer;
    126 // typedef CBuffer<wchar_t> CWCharBuffer;
    127 typedef CBuffer<unsigned char> CByteBuffer;
    128 
    129 
    130 template <class T> class CObjArray
    131 {
    132 protected:
    133  T *_items;
    134 private:
    135  // we disable copy
    136  CObjArray(const CObjArray &buffer);
    137  void operator=(const CObjArray &buffer);
    138 public:
    139  void Free()
    140  {
    141    delete []_items;
    142    _items = 0;
    143  }
    144  CObjArray(size_t size): _items(0)
    145  {
    146    if (size != 0)
    147    {
    148      MY_ARRAY_NEW(_items, T, size)
    149      // _items = new T[size];
    150    }
    151  }
    152  CObjArray(): _items(0) {};
    153  ~CObjArray() { delete []_items; }
    154  
    155  operator       T *()       { return _items; }
    156  operator const T *() const { return _items; }
    157  
    158  void Alloc(size_t newSize)
    159  {
    160    delete []_items;
    161    _items = 0;
    162    MY_ARRAY_NEW(_items, T, newSize)
    163    // _items = new T[newSize];
    164  }
    165 };
    166 
    167 typedef CObjArray<unsigned char> CByteArr;
    168 typedef CObjArray<bool> CBoolArr;
    169 typedef CObjArray<int> CIntArr;
    170 typedef CObjArray<unsigned> CUIntArr;
    171 
    172 
    173 template <class T> class CObjArray2
    174 {
    175  T *_items;
    176  unsigned _size;
    177 
    178  // we disable copy
    179  CObjArray2(const CObjArray2 &buffer);
    180  void operator=(const CObjArray2 &buffer);
    181 public:
    182  
    183  void Free()
    184  {
    185    delete []_items;
    186    _items = 0;
    187    _size = 0;
    188  }
    189  CObjArray2(): _items(0), _size(0) {};
    190  /*
    191  CObjArray2(const CObjArray2 &buffer): _items(0), _size(0)
    192  {
    193    size_t newSize = buffer._size;
    194    if (newSize != 0)
    195    {
    196      T *newBuffer = new T[newSize];;
    197      _items = newBuffer;
    198      _size = newSize;
    199      const T *src = buffer;
    200      for (size_t i = 0; i < newSize; i++)
    201        newBuffer[i] = src[i];
    202    }
    203  }
    204  */
    205  /*
    206  CObjArray2(size_t size): _items(0), _size(0)
    207  {
    208    if (size != 0)
    209    {
    210      _items = new T[size];
    211      _size = size;
    212    }
    213  }
    214  */
    215 
    216  ~CObjArray2() { delete []_items; }
    217  
    218  operator       T *()       { return _items; }
    219  operator const T *() const { return _items; }
    220  
    221  unsigned Size() const { return (unsigned)_size; }
    222  bool IsEmpty() const { return _size == 0; }
    223 
    224  // SetSize doesn't keep old items. It allocates new array if size is not equal
    225  void SetSize(unsigned size)
    226  {
    227    if (size == _size)
    228      return;
    229    T *newBuffer = NULL;
    230    if (size != 0)
    231    {
    232      MY_ARRAY_NEW(newBuffer, T, size)
    233      // newBuffer = new T[size];
    234    }
    235    delete []_items;
    236    _items = newBuffer;
    237    _size = size;
    238  }
    239 
    240  /*
    241  CObjArray2& operator=(const CObjArray2 &buffer)
    242  {
    243    Free();
    244    size_t newSize = buffer._size;
    245    if (newSize != 0)
    246    {
    247      T *newBuffer = new T[newSize];;
    248      _items = newBuffer;
    249      _size = newSize;
    250      const T *src = buffer;
    251      for (size_t i = 0; i < newSize; i++)
    252        newBuffer[i] = src[i];
    253    }
    254    return *this;
    255  }
    256  */
    257 };
    258 
    259 #endif