123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- // XDWHolder.tlh
- //
- #pragma once
- template <typename T> 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 <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 ();
- virtual T * NewObject (const T * fromObject) const;
- };
|