// XDWHolder.tlh // #pragma once template class XDWHolder { typedef T __BASE; private: struct MetaData { long nRefs; // reference count }; protected: T * m_pObject; MetaData * m_pMetaData; public: XDWHolder (); explicit XDWHolder (T * object); XDWHolder (const XDWHolder & h); XDWHolder (XDWHolder && h); virtual ~XDWHolder (); public: void Attach (T * object); T * Detach (); // real copy from another XDWHolder void CopyFrom (const XDWHolder & h); // ref-counted copy from another XDWHolder void ShadowCopyFrom (const XDWHolder & h); XDWHolder & operator = (const XDWHolder & h); XDWHolder & operator = (T * object); operator bool () const; operator T * (); operator const T * () const; // Allow usage as a pointer T * operator -> () { return m_pObject; } const T * operator -> () const { return m_pObject; } inline bool operator == (const XDWHolder & holder) const { return m_pObject == holder.m_pObject; } inline bool operator != (const XDWHolder & 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 (); virtual T * NewObject (const T * fromObject) const; };