00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef SGWeakPtr_HXX
00019 #define SGWeakPtr_HXX
00020
00021 #include "SGWeakReferenced.hxx"
00022
00023 template<typename T>
00024 class SGWeakPtr {
00025 public:
00026 SGWeakPtr(void)
00027 { }
00028 SGWeakPtr(const SGWeakPtr& p) : mWeakData(p.mWeakData)
00029 { }
00030 SGWeakPtr(T* ptr)
00031 { assign(ptr); }
00032 template<typename U>
00033 SGWeakPtr(const SGSharedPtr<U>& p)
00034 { SGSharedPtr<T> sharedPtr = p; assign(sharedPtr.get()); }
00035 template<typename U>
00036 SGWeakPtr(const SGWeakPtr<U>& p)
00037 { SGSharedPtr<T> sharedPtr = p.lock(); assign(sharedPtr.get()); }
00038 ~SGWeakPtr(void)
00039 { }
00040
00041 template<typename U>
00042 SGWeakPtr& operator=(const SGSharedPtr<U>& p)
00043 { SGSharedPtr<T> sharedPtr = p; assign(sharedPtr.get()); return *this; }
00044 template<typename U>
00045 SGWeakPtr& operator=(const SGWeakPtr<U>& p)
00046 { SGSharedPtr<T> sharedPtr = p.lock(); assign(sharedPtr.get()); return *this; }
00047 SGWeakPtr& operator=(const SGWeakPtr& p)
00048 { mWeakData = p.mWeakData; return *this; }
00049
00050 SGSharedPtr<T> lock(void) const
00051 {
00052 if (!mWeakData)
00053 return SGSharedPtr<T>();
00054 SGSharedPtr<T> sharedPtr;
00055 sharedPtr.assignNonRef(mWeakData->getPointer<T>());
00056 return sharedPtr;
00057 }
00058
00059 void clear()
00060 { mWeakData = 0; }
00061 void swap(SGWeakPtr& weakPtr)
00062 { mWeakData.swap(weakPtr.mWeakData); }
00063
00064 private:
00065 void assign(T* p)
00066 {
00067 if (p)
00068 mWeakData = p->mWeakData;
00069 else
00070 mWeakData = 0;
00071 }
00072
00073
00074 SGSharedPtr<SGWeakReferenced::WeakData> mWeakData;
00075 };
00076
00077 #endif