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