123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- // TmplBlockBuffer.hpp
- //
- #pragma once
- //-----------------------------------------------------------------------------
- // TmplBlockBuffer
- //
- // 定义一个连续的内存块
- //-----------------------------------------------------------------------------
- template <typename T> class TmplBlockBuffer
- {
- typedef T __BASE;
- private:
- struct MetaData
- {
- long nRefs; // reference count
- int nCount; // Number of item
- };
- protected:
- T * m_pObject;
- MetaData * m_pMetaData;
- public:
- TmplBlockBuffer ();
- explicit TmplBlockBuffer (T * object, int count);
- TmplBlockBuffer (const TmplBlockBuffer & h);
- TmplBlockBuffer (TmplBlockBuffer && h);
- // 从 h 构造一个新的对象, 但是我只要前面的 count 个字符, 如果 count 比 h.nCount 大, 那就重新分配然后 memcpy
- TmplBlockBuffer (TmplBlockBuffer && h, int count);
- virtual ~TmplBlockBuffer ();
- public:
- void Attach (T * object, int count);
- T * Detach ();
- // real copy from another TmplBlockBuffer
- void CopyFrom (const TmplBlockBuffer & h);
- // ref-counted copy from another TmplBlockBuffer
- void ShadowCopyFrom (const TmplBlockBuffer & h);
- TmplBlockBuffer & operator = (const TmplBlockBuffer & h);
- TmplBlockBuffer & operator = (TmplBlockBuffer && h);
- T * GetBufferSetCount (int count);
- void CopyFrom (const T * from, int count);
- void CopyTo (T * to, int count) const;
- operator bool () const;
- operator T * ();
- operator const T * () const;
- int GetCount () const
- {
- if (m_pMetaData)
- return m_pMetaData->nCount;
- return 0;
- }
- // Allow usage as a pointer
- T * operator -> ()
- {
- return m_pObject;
- }
- const T * operator -> () const
- {
- return m_pObject;
- }
- inline bool operator == (const TmplBlockBuffer & holder) const
- {
- return m_pObject == holder.m_pObject;
- }
- inline bool operator != (const TmplBlockBuffer & holder) const
- {
- return m_pObject != holder.m_pObject;
- }
- T * As ()
- {
- return m_pObject;
- }
- const T * As () const
- {
- return m_pObject;
- }
- template <typename C> C * AS ()
- {
- return (C *) m_pObject;
- }
- template <typename C> const C * AS () const
- {
- return (const C *) m_pObject;
- }
- bool IsEmpty () const;
- void Release ();
- protected:
- inline MetaData * GetData () const
- {
- return m_pMetaData;
- }
- protected:
- void Init ();
- void MoveAssign (TmplBlockBuffer & Src);
- };
- // 为像素数据定义一个专用的类型
- typedef TmplBlockBuffer <UINT8> BlockBuffer;
- typedef BlockBuffer IBlockBuffer;
- typedef BlockBuffer OBlockBuffer;
|