Main Page | Modules | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members

Ptr.hpp

Go to the documentation of this file.
00001 #ifndef CAFE_PTR_HPP
00002 #define CAFE_PTR_HPP
00003 
00004 namespace cafe {
00005 
00006     //
00007     // template smart pointer for intrusive reference counted objects
00008     // using TRefCount.
00009     //
00010     template<class T>
00011     class Ptr {
00012     public:
00013         Ptr(T *p)
00014             : fRef(p)
00015         {
00016             if(fRef) fRef->AddReference();
00017         }
00018 
00019         template<class Y>
00020         Ptr(Y *p)
00021             : fRef(p)
00022         {
00023             if(fRef) fRef->AddReference();
00024         }
00025 
00026         ~Ptr()
00027         {
00028             decrement();
00029         }
00030 
00031         Ptr(const Ptr<T>& other)
00032         {
00033             if(fRef = other.fRef) {
00034                 fRef->AddReference();
00035             }
00036         }
00037 
00038         template<class Y>
00039         Ptr(const Ptr<Y>& other)
00040         {
00041             if(fRef = other.fRef) {
00042                 fRef->AddReference();
00043             }
00044         }
00045 
00046         Ptr<T>& operator=(const Ptr<T>& other)
00047         {
00048             if(this != &other) {
00049                 decrement();
00050                 if((fRef = other.fRef) != 0) {
00051                     fRef->AddReference();
00052                 }
00053             }
00054             return *this;
00055         }
00056 
00057         template<class Y>
00058         Ptr<T>& operator=(const Ptr<Y>& other)
00059         {
00060             if(this != &other) {
00061                 decrement();
00062                 if(fRef = other.fRef) {
00063                     fRef->AddReference();
00064                 }
00065             }
00066             return *this;
00067         }
00068 
00069         template<class Y>
00070         void reset(Y *p)
00071         {
00072             decrement();
00073             if(fRef = p)
00074                 fRef->AddReference();
00075         }
00076 
00077         T *operator->()            { return fRef;  }
00078         T& operator*()             { return *fRef; }
00079         const T& operator*() const { return *fRef; }
00080         T *get() { return fRef; }
00081     private:
00082         void decrement()
00083         {
00084             if(fRef && fRef->RemoveReference() == 0) {
00085                 delete fRef;
00086             }
00087         }
00088         T *fRef;
00089     };
00090 
00091 }
00092 
00093 #endif // CAFE_PTR_HPP

Generated on Tue Mar 28 10:13:04 2006 for CAF by doxygen 1.3.4