XDWHolder.tlh 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // XDWHolder.tlh
  2. //
  3. #pragma once
  4. template <typename T> class XDWHolder
  5. {
  6. typedef T __BASE;
  7. private:
  8. struct MetaData
  9. {
  10. long nRefs; // reference count
  11. };
  12. protected:
  13. T * m_pObject;
  14. MetaData * m_pMetaData;
  15. public:
  16. XDWHolder ();
  17. explicit XDWHolder (T * object);
  18. XDWHolder (const XDWHolder & h);
  19. XDWHolder (XDWHolder && h);
  20. virtual ~XDWHolder ();
  21. public:
  22. void Attach (T * object);
  23. T * Detach ();
  24. // real copy from another XDWHolder
  25. void CopyFrom (const XDWHolder & h);
  26. // ref-counted copy from another XDWHolder
  27. void ShadowCopyFrom (const XDWHolder & h);
  28. XDWHolder & operator = (const XDWHolder & h);
  29. XDWHolder & operator = (T * object);
  30. operator bool () const;
  31. operator T * ();
  32. operator const T * () const;
  33. // Allow usage as a pointer
  34. T * operator -> ()
  35. {
  36. return m_pObject;
  37. }
  38. const T * operator -> () const
  39. {
  40. return m_pObject;
  41. }
  42. inline bool operator == (const XDWHolder & holder) const
  43. {
  44. return m_pObject == holder.m_pObject;
  45. }
  46. inline bool operator != (const XDWHolder & holder) const
  47. {
  48. return m_pObject != holder.m_pObject;
  49. }
  50. T * As ()
  51. {
  52. return m_pObject;
  53. }
  54. const T * As () const
  55. {
  56. return m_pObject;
  57. }
  58. template <typename C> C * AS ()
  59. {
  60. return (C *) m_pObject;
  61. }
  62. template <typename C> const C * AS () const
  63. {
  64. return (const C *) m_pObject;
  65. }
  66. bool IsEmpty () const;
  67. void Release ();
  68. protected:
  69. inline MetaData * GetData() const
  70. {
  71. return m_pMetaData;
  72. }
  73. protected:
  74. void Init ();
  75. virtual T * NewObject (const T * fromObject) const;
  76. };