Home | History | Annotate | Download | only in Common
      1 // Common/Buffer.h
      2 
      3 #ifndef __COMMON_BUFFER_H
      4 #define __COMMON_BUFFER_H
      5 
      6 #include "Defs.h"
      7 
      8 template <class T> class CBuffer
      9 {
     10 protected:
     11   size_t _capacity;
     12   T *_items;
     13 public:
     14   void Free()
     15   {
     16     delete []_items;
     17     _items = 0;
     18     _capacity = 0;
     19   }
     20   CBuffer(): _capacity(0), _items(0) {};
     21   CBuffer(const CBuffer &buffer): _capacity(0), _items(0) { *this = buffer; }
     22   CBuffer(size_t size): _items(0), _capacity(0) {  SetCapacity(size); }
     23   virtual ~CBuffer() { delete []_items; }
     24   operator T *() { return _items; };
     25   operator const T *() const { return _items; };
     26   size_t GetCapacity() const { return  _capacity; }
     27   void SetCapacity(size_t newCapacity)
     28   {
     29     if (newCapacity == _capacity)
     30       return;
     31     T *newBuffer;
     32     if (newCapacity > 0)
     33     {
     34       newBuffer = new T[newCapacity];
     35       if (_capacity > 0)
     36         memmove(newBuffer, _items, MyMin(_capacity, newCapacity) * sizeof(T));
     37     }
     38     else
     39       newBuffer = 0;
     40     delete []_items;
     41     _items = newBuffer;
     42     _capacity = newCapacity;
     43   }
     44   CBuffer& operator=(const CBuffer &buffer)
     45   {
     46     Free();
     47     if (buffer._capacity > 0)
     48     {
     49       SetCapacity(buffer._capacity);
     50       memmove(_items, buffer._items, buffer._capacity * sizeof(T));
     51     }
     52     return *this;
     53   }
     54 };
     55 
     56 template <class T>
     57 bool operator==(const CBuffer<T>& b1, const CBuffer<T>& b2)
     58 {
     59   if (b1.GetCapacity() != b2.GetCapacity())
     60     return false;
     61   for (size_t i = 0; i < b1.GetCapacity(); i++)
     62     if (b1[i] != b2[i])
     63       return false;
     64   return true;
     65 }
     66 
     67 template <class T>
     68 bool operator!=(const CBuffer<T>& b1, const CBuffer<T>& b2)
     69 {
     70   return !(b1 == b2);
     71 }
     72 
     73 typedef CBuffer<char> CCharBuffer;
     74 typedef CBuffer<wchar_t> CWCharBuffer;
     75 typedef CBuffer<unsigned char> CByteBuffer;
     76 
     77 #endif
     78