00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef SGSharedPtr_HXX
00022 #define SGSharedPtr_HXX
00023
00024 #include "SGReferenced.hxx"
00025
00044
00045 template<typename T>
00046 class SGWeakPtr;
00047
00048 template<typename T>
00049 class SGSharedPtr {
00050 public:
00051 SGSharedPtr(void) : _ptr(0)
00052 {}
00053 SGSharedPtr(T* ptr) : _ptr(ptr)
00054 { get(_ptr); }
00055 SGSharedPtr(const SGSharedPtr& p) : _ptr(p.get())
00056 { get(_ptr); }
00057 template<typename U>
00058 SGSharedPtr(const SGSharedPtr<U>& p) : _ptr(p.get())
00059 { get(_ptr); }
00060 ~SGSharedPtr(void)
00061 { put(); }
00062
00063 SGSharedPtr& operator=(const SGSharedPtr& p)
00064 { assign(p.get()); return *this; }
00065 template<typename U>
00066 SGSharedPtr& operator=(const SGSharedPtr<U>& p)
00067 { assign(p.get()); return *this; }
00068 template<typename U>
00069 SGSharedPtr& operator=(U* p)
00070 { assign(p); return *this; }
00071
00072 T* operator->(void) const
00073 { return _ptr; }
00074 T& operator*(void) const
00075 { return *_ptr; }
00076 operator T*(void) const
00077 { return _ptr; }
00078 T* ptr(void) const
00079 { return _ptr; }
00080 T* get(void) const
00081 { return _ptr; }
00082 T* release()
00083 { T* tmp = _ptr; _ptr = 0; T::put(tmp); return tmp; }
00084
00085 bool isShared(void) const
00086 { return T::shared(_ptr); }
00087 unsigned getNumRefs(void) const
00088 { return T::count(_ptr); }
00089
00090 bool valid(void) const
00091 { return _ptr; }
00092
00093 void clear()
00094 { put(); }
00095 void swap(SGSharedPtr& sharedPtr)
00096 { T* tmp = _ptr; _ptr = sharedPtr._ptr; sharedPtr._ptr = tmp; }
00097
00098 private:
00099 void assign(T* p)
00100 { get(p); put(); _ptr = p; }
00101 void assignNonRef(T* p)
00102 { put(); _ptr = p; }
00103
00104 void get(const T* p) const
00105 { T::get(p); }
00106 void put(void)
00107 { if (!T::put(_ptr)) { delete _ptr; _ptr = 0; } }
00108
00109
00110 T* _ptr;
00111
00112 template<typename U>
00113 friend class SGWeakPtr;
00114 };
00115
00119 template<typename T>
00120 T* get_pointer(SGSharedPtr<T> const & p)
00121 {
00122 return p.ptr();
00123 }
00124 #endif