shared_ptr.inl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. ///////////////////////////////////////////////////////////////////////////
  2. // Interstate Gangs : smart_ptr.inl
  3. ///////////////////////////////////////////////////////////////////////////
  4. // This file is under GPL licence
  5. ///////////////////////////////////////////////////////////////////////////
  6. // CHANGELOG
  7. // Groove - 13/06/2005 :
  8. // - Create file
  9. ///////////////////////////////////////////////////////////////////////////
  10. namespace gli
  11. {
  12. template <typename T>
  13. util::CSmartPtr<T>::CSmartPtr()
  14. {
  15. m_pPointer = 0;
  16. }
  17. template <typename T>
  18. util::CSmartPtr<T>::CSmartPtr(const util::CSmartPtr<T> & SmartPtr)
  19. {
  20. m_pReference = SmartPtr.m_pReference;
  21. m_pPointer = SmartPtr.m_pPointer;
  22. (*m_pReference)++;
  23. }
  24. template <typename T>
  25. util::CSmartPtr<T>::CSmartPtr(T* pPointer)
  26. {
  27. m_pReference = new int;
  28. m_pPointer = pPointer;
  29. (*m_pReference) = 1;
  30. }
  31. template <typename T>
  32. util::CSmartPtr<T>::~CSmartPtr()
  33. {
  34. if(!m_pPointer)
  35. return;
  36. (*m_pReference)--;
  37. if(*m_pReference <= 0)
  38. {
  39. delete m_pReference;
  40. delete m_pPointer;
  41. }
  42. }
  43. template <typename T>
  44. util::CSmartPtr<T>& util::CSmartPtr<T>::operator=(const util::CSmartPtr<T> & SmartPtr)
  45. {
  46. if(m_pPointer)
  47. {
  48. (*m_pReference)--;
  49. if(*m_pReference <= 0)
  50. {
  51. delete m_pReference;
  52. delete m_pPointer;
  53. }
  54. }
  55. m_pReference = SmartPtr.m_pReference;
  56. m_pPointer = SmartPtr.m_pPointer;
  57. (*m_pReference)++;
  58. return *this;
  59. }
  60. template <typename T>
  61. util::CSmartPtr<T>& util::CSmartPtr<T>::operator=(T* pPointer)
  62. {
  63. if(m_pPointer)
  64. {
  65. (*m_pReference)--;
  66. if(*m_pReference <= 0)
  67. {
  68. delete m_pReference;
  69. delete m_pPointer;
  70. }
  71. }
  72. m_pReference = new int;
  73. m_pPointer = pPointer;
  74. (*m_pReference) = 1;
  75. return *this;
  76. }
  77. template <typename T>
  78. bool util::CSmartPtr<T>::operator==(const util::CSmartPtr<T> & SmartPtr) const
  79. {
  80. return m_pPointer == SmartPtr.m_pPointer;
  81. }
  82. template <typename T>
  83. bool util::CSmartPtr<T>::operator!=(const util::CSmartPtr<T> & SmartPtr) const
  84. {
  85. return m_pPointer != SmartPtr.m_pPointer;
  86. }
  87. template <typename T>
  88. T& util::CSmartPtr<T>::operator*()
  89. {
  90. return *m_pPointer;
  91. }
  92. template <typename T>
  93. T* util::CSmartPtr<T>::operator->()
  94. {
  95. return m_pPointer;
  96. }
  97. template <typename T>
  98. const T& util::CSmartPtr<T>::operator*() const
  99. {
  100. return *m_pPointer;
  101. }
  102. template <typename T>
  103. const T* util::CSmartPtr<T>::operator->() const
  104. {
  105. return m_pPointer;
  106. }
  107. }//namespace gli