- Cal3D 0.11 API Reference -

refptr.h

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         // For compatibility with Boost.Python.
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     // For compatibility with Boost.Python.
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

Generated at Thu Jun 29 19:03:59 2006 by The Cal3D Team with Doxygen 1.4.6