00001 #ifndef CAL_REF_PTR_H
00002 #define CAL_REF_PTR_H
00003
00004
00005 namespace cal3d
00006 {
00007
00009 template<typename T>
00010 class RefPtr
00011 {
00012 public:
00013
00014 typedef T element_type;
00015
00016 RefPtr(T* ptr = 0)
00017 {
00018 m_ptr = 0;
00019 *this = ptr;
00020 }
00021
00022 RefPtr(const RefPtr<T>& ptr)
00023 {
00024 m_ptr = 0;
00025 *this = ptr;
00026 }
00027
00028 ~RefPtr()
00029 {
00030 if (m_ptr)
00031 {
00032 explicitDecRef(m_ptr);
00033 m_ptr = 0;
00034 }
00035 }
00036
00037 template<typename U>
00038 RefPtr<T>& operator=(U* ptr)
00039 {
00040 if (ptr != m_ptr)
00041 {
00042 if (m_ptr)
00043 {
00044 explicitDecRef(m_ptr);
00045 }
00046 m_ptr = ptr;
00047 if (m_ptr)
00048 {
00049 explicitIncRef(m_ptr);
00050 }
00051 }
00052 return *this;
00053 }
00054
00055 template<typename U>
00056 RefPtr<T>& operator=(const RefPtr<U>& ptr)
00057 {
00058 *this = ptr.get();
00059 return *this;
00060 }
00061
00063 RefPtr<T>& operator=(const RefPtr<T>& ptr)
00064 {
00065 *this = ptr.get();
00066 return *this;
00067 }
00068
00070 bool operator!() const
00071 {
00072 return !get();
00073 }
00074
00075 T* operator->() const
00076 {
00077 assert(get() && "Accessing member of null pointer!");
00078 return get();
00079 }
00080
00081 T& operator*() const
00082 {
00083 assert(get() && "Dereferencing null pointer!");
00084 return *get();
00085 }
00086
00087 typedef RefPtr<T> this_type;
00088
00090 typedef T* this_type::*unspecified_bool_type;
00091
00093 operator unspecified_bool_type() const
00094 {
00095 return (get() ? &this_type::m_ptr : 0);
00096 }
00097
00098 T* get() const
00099 {
00100 assert(!m_ptr || m_ptr->getRefCount() > 0 &&
00101 "Dereferencing pointer with refCount <= 0");
00102 return m_ptr;
00103 }
00104
00105 private:
00106 T* m_ptr;
00107 };
00108
00109
00110
00111 template<class T>
00112 T* get_pointer(const RefPtr<T>& p)
00113 {
00114 return p.get();
00115 }
00116
00117
00118 template<typename T, typename U>
00119 bool operator==(const RefPtr<T>& a, const RefPtr<U>& b)
00120 {
00121 return (a.get() == b.get());
00122 }
00123
00124 template<typename T, typename U>
00125 bool operator==(const RefPtr<T>& a, const U* b)
00126 {
00127 return (a.get() == b);
00128 }
00129
00130 template<typename T, typename U>
00131 bool operator==(const T* a, const RefPtr<U>& b)
00132 {
00133 return (a == b.get());
00134 }
00135
00136
00137 template<typename T, typename U>
00138 bool operator!=(const RefPtr<T>& a, const RefPtr<U>& b)
00139 {
00140 return (a.get() != b.get());
00141 }
00142
00143 template<typename T, typename U>
00144 bool operator!=(const RefPtr<T>& a, const U* b)
00145 {
00146 return (a.get() != b);
00147 }
00148
00149 template<typename T, typename U>
00150 bool operator!=(const T* a, const RefPtr<U>& b)
00151 {
00152 return (a != b.get());
00153 }
00154
00155
00156 template<typename T, typename U>
00157 bool operator<(const RefPtr<T>& a, const RefPtr<U>& b)
00158 {
00159 return (a.get() < b.get());
00160 }
00161
00162 template<typename T, typename U>
00163 bool operator<(const RefPtr<T>& a, const U* b)
00164 {
00165 return (a.get() < b);
00166 }
00167
00168 template<typename T, typename U>
00169 bool operator<(const T* a, const RefPtr<U>& b)
00170 {
00171 return (a < b.get());
00172 }
00173
00174
00175 }
00176
00177
00178 #endif