Clone
ixen <ixen@copyhandler.com>
committed
on 17 May 07
Added preliminary support for saving xml file.
LoggerImprovements + 5 more
ext/libicpf/src/libicpf/buffer.h (+109)
  1 #ifndef __BUFFER_H__
  2 #define __BUFFER_H__
  3
  4 #include "libicpf.h"
  5 #include "gen_types.h"
  6
  7 BEGIN_ICPF_NAMESPACE
  8
  9 template<class T>
  10 class buffer
  11 {
  12 public:
  13 /** \name Construction/destruction/operators */
  14 /**@{*/
  15         buffer();
  16         buffer(const T* pData, size_t stCount);
  17         buffer(const buffer& rSrc);
  18         ~buffer();
  19
  20         buffer& operator=(const buffer& rSrc);
  21         const T* operator T*() const; { return m_pData; };
  22 /**@}*/
  23
  24         size_t get_size() const { return m_stBufSize; };
  25         void resize(size_t stNewSize);
  26
  27         size_t get_block_size() const { return m_stBlockSize; };
  28         void set_block_size(size_t stBlockSize);
  29
  30         size_t get_max_unused() const { return m_stMaxUnused; };
  31         size_t set_max_unused();
  32
  33 protected:
  34         T* m_pData;                             ///< Pointer to the data
  35         size_t m_stBufSize;             ///< Current buffer size
  36         size_t m_stBlockSize;   ///< Block size
  37         size_t m_stMaxUnused;   ///< Max count of unused items allowed
  38 };
  39
  40 template<class T>
  41 buffer::buffer() :
  42         m_pData(NULL),
  43         m_stBufSize(0),
  44         m_stBlockSize(1024),
  45         m_stMaxUnused(1024)
  46 {
  47 }
  48
  49 template<class T>
  50 buffer::buffer(const T* pData, size_t stCount) :
  51         m_pData(NULL),
  52         m_stBufSize(0),
  53         m_stBlockSize(1024),
  54         m_stMaxUnused(1024)
  55 {
  56         resize(stCount);
  57         memcpy(m_pData, pData, stCount*sizeof(T));
  58 }
  59
  60 template<class T>
  61 buffer::buffer(const buffer& rSrc) :
  62         m_pData((rSrc.m_stBufSize > 0) ? new T[rSrc.m_stBufSize] : NULL),
  63         m_stBufSize(rSrc.m_stBufSize),
  64         m_stBlockSize(rSrc.m_stBlockSize),
  65         m_stMaxUnused(rSrc.m_stMaxUnused)
  66 {
  67         assert(m_stBlockSize > 0);
  68         if (m_pData)
  69                 memcpy(m_pData, pData, stCount*sizeof(T));
  70 }
  71
  72 template<class T>
  73 buffer::~buffer()
  74 {
  75         delete [] m_pData;
  76 }
  77
  78 template<class T>
  79 buffer& buffer::operator=(const buffer& rSrc)
  80 {
  81         if (this != &rSrc)
  82         {
  83                 delete [] m_pData;
  84
  85                 m_pData=((rSrc.m_stBufSize > 0) ? new T[rSrc.m_stBufSize] : NULL);
  86                 m_stBufSize=rSrc.m_stBufSize;
  87                 m_stBlockSize=rSrc.m_stBlockSize;
  88                 m_stMaxUnused=rSrc.m_stMaxUnused;
  89
  90         }
  91
  92         return *this;
  93 }
  94
  95 template<class T>
  96 const T* operator T*() const; { return m_pData; };
  97
  98 template<class T>
  99 void resize(size_t stNewSize);
  100
  101 template<class T>
  102 void set_block_size(size_t stBlockSize);
  103
  104 template<class T>
  105 size_t set_max_unused();
  106
  107 END_ICPF_NAMESPACE
  108
  109 #endif