chxsmartptr.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:4k
源码类别:

Symbian

开发平台:

Visual C++

  1. /************************************************************************
  2.  * chxsmartptr.h
  3.  * -------------
  4.  * Smart pointer base class.
  5.  * 
  6.  * Target:
  7.  * Symbian OS
  8.  *
  9.  *
  10.  * (c) 1995-2003 RealNetworks, Inc. Patents pending. All rights reserved.
  11.  *
  12.  ************************************************************************/
  13. #ifndef _chxsmartptr_h_
  14. #define _chxsmartptr_h_
  15. template<class T>
  16. class CHXSmartCPtr { // const smart pointer
  17. public:
  18.   CHXSmartCPtr(const T* p = 0);
  19.   CHXSmartCPtr(const CHXSmartCPtr<T>& sp);
  20.   ~CHXSmartCPtr();
  21.   CHXSmartCPtr<T>& operator=(const CHXSmartCPtr<T>& sp);
  22.   CHXSmartCPtr<T>& operator=(const T* p);
  23.   int operator==(const CHXSmartCPtr<T>& sp) const;
  24.   int operator==(const T* p) const;
  25.   int operator!=(const CHXSmartCPtr<T>& sp) const;
  26.   int operator!=(const T* p) const;
  27.   const T* operator->() const;
  28.   const T& operator*() const;
  29.   operator bool() const;
  30.   const T* raw_ptr() const;
  31. protected:
  32.   union {
  33.     const T* cptr_; // const pointer
  34.     T* ptr_; // mutable pointer
  35.   };
  36. };
  37. template<class T>
  38. class CHXSmartPtr : public CHXSmartCPtr<T> { // mutable smart pointer
  39. public:
  40.   CHXSmartPtr(T* p = 0);
  41.   CHXSmartPtr<T>& operator=(T* p);
  42.   T* operator->() const;
  43.   T& operator*() const;
  44.   T* raw_ptr() const;
  45. };
  46. template<class T>
  47. unsigned hash_func(const CHXSmartCPtr<T>& sp, unsigned sz);
  48. template<class T>
  49. unsigned hash_func(const CHXSmartPtr<T>& sp, unsigned sz);
  50. /**    CHXSmartCPtr<T>    **/
  51. template<class T>
  52. inline CHXSmartCPtr<T>::CHXSmartCPtr(const T* p)
  53. : cptr_(p)
  54. {
  55.   if (cptr_) ptr_->ref();
  56. }
  57. template<class T>
  58. inline CHXSmartCPtr<T>::CHXSmartCPtr(const CHXSmartCPtr<T>& sp)
  59. : cptr_(sp.cptr_)
  60. {
  61.   if (cptr_) ptr_->ref();
  62. }
  63. template<class T>
  64. inline CHXSmartCPtr<T>::~CHXSmartCPtr()
  65. {
  66.   if (ptr_ && ptr_->unref() == 0) {
  67.     delete ptr_;
  68.     ptr_ = 0;
  69.   }
  70. }
  71. template<class T>
  72. inline CHXSmartCPtr<T>&  CHXSmartCPtr<T>::operator=(const CHXSmartCPtr<T>& sp)
  73. {
  74.   if (sp.ptr_) sp.ptr_->ref();
  75.   if (ptr_ && ptr_->unref() == 0)
  76.     delete ptr_;
  77.   cptr_ = sp.cptr_;
  78.   return *this;
  79. }
  80. template<class T>
  81. inline CHXSmartCPtr<T>&  CHXSmartCPtr<T>::operator=(const T* p)
  82. {
  83.   if (p) ((T*)p)->ref();
  84.   if (ptr_ && ptr_->unref() == 0)
  85.     delete ptr_;
  86.   cptr_ = p;
  87.   return *this;
  88. }
  89. template<class T>
  90. inline int CHXSmartCPtr<T>::operator==(const CHXSmartCPtr<T>& sp) const
  91. {
  92.   return cptr_ == sp.cptr_;
  93. }
  94. template<class T>
  95. inline int CHXSmartCPtr<T>::operator==(const T* p) const
  96. {
  97.  return cptr_ == p;
  98. }
  99. template<class T>
  100. inline int CHXSmartCPtr<T>::operator!=(const CHXSmartCPtr<T>& sp) const
  101. {
  102.   return cptr_ != sp.cptr_;
  103. }
  104. template<class T>
  105. inline int CHXSmartCPtr<T>::operator!=(const T* p) const
  106. {
  107.   return cptr_ != p;
  108. }
  109. template<class T>
  110. inline  const T* CHXSmartCPtr<T>::operator->() const
  111. {
  112.   return cptr_;
  113. }
  114. template<class T>
  115. inline const T& CHXSmartCPtr<T>::operator*() const
  116. {
  117.   return *cptr_;
  118. }
  119. template<class T>
  120. inline CHXSmartCPtr<T>::operator bool () const
  121. {
  122.   return cptr_ != 0;
  123. }
  124. template<class T>
  125. inline const T* CHXSmartCPtr<T>::raw_ptr() const
  126. {
  127.   return cptr_ ;
  128. }
  129. /**    CHXSmartPtr<T>    **/
  130. template<class T>
  131. inline CHXSmartPtr<T>::CHXSmartPtr(T* p)
  132. : CHXSmartCPtr<T>(p)
  133. {}
  134. template<class T>
  135. inline CHXSmartPtr<T>& CHXSmartPtr<T>::operator=(T* p)
  136. {
  137.   (void) CHXSmartCPtr<T>::operator=(p);
  138.   return *this;
  139. }
  140. template<class T>
  141. inline  T* CHXSmartPtr<T>::operator->() const
  142. {
  143.   return ptr_;
  144. }
  145. template<class T>
  146. inline T& CHXSmartPtr<T>::operator*() const
  147. {
  148.   return *ptr_;
  149. }
  150. template<class T>
  151. inline T* CHXSmartPtr<T>::raw_ptr() const
  152. {
  153.   return ptr_ ;
  154. }
  155. template<class T>
  156. inline unsigned hash_func(const CHXSmartCPtr<T>& sp, unsigned sz)
  157. {
  158.   return ((unsigned) sp.raw_ptr())%sz;
  159. }
  160. template<class T>
  161. inline unsigned hash_func(const CHXSmartPtr<T>& sp, unsigned sz)
  162. {
  163.   return ((unsigned) sp.raw_ptr())%sz;
  164. }
  165. #endif // _chxsmartptr_h_