// TmplBlockBuffer.hpp // #pragma once //----------------------------------------------------------------------------- // TmplBlockBuffer // // 定义一个连续的内存块 //----------------------------------------------------------------------------- template 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 C * AS () { return (C *) m_pObject; } template 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 BlockBuffer; typedef BlockBuffer IBlockBuffer; typedef BlockBuffer OBlockBuffer;