]> git.mxchange.org Git - simgear.git/blob - simgear/structure/SGWeakPtr.hxx
Working 'noshadow' animation
[simgear.git] / simgear / structure / SGWeakPtr.hxx
1 // Copyright (C) 2004-2009  Mathias Froehlich - Mathias.Froehlich@web.de
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Library General Public
5 // License as published by the Free Software Foundation; either
6 // version 2 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Library General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
16 //
17
18 #ifndef SGWeakPtr_HXX
19 #define SGWeakPtr_HXX
20
21 #include "SGWeakReferenced.hxx"
22
23 template<typename T>
24 class SGWeakPtr {
25 public:
26   SGWeakPtr(void)
27   { }
28   SGWeakPtr(const SGWeakPtr& p) : mWeakData(p.mWeakData)
29   { }
30   SGWeakPtr(T* ptr)
31   { assign(ptr); }
32   template<typename U>
33   SGWeakPtr(const SGSharedPtr<U>& p)
34   { SGSharedPtr<T> sharedPtr = p; assign(sharedPtr.get()); }
35   template<typename U>
36   SGWeakPtr(const SGWeakPtr<U>& p)
37   { SGSharedPtr<T> sharedPtr = p.lock(); assign(sharedPtr.get()); }
38   ~SGWeakPtr(void)
39   { }
40   
41   template<typename U>
42   SGWeakPtr& operator=(const SGSharedPtr<U>& p)
43   { SGSharedPtr<T> sharedPtr = p; assign(sharedPtr.get()); return *this; }
44   template<typename U>
45   SGWeakPtr& operator=(const SGWeakPtr<U>& p)
46   { SGSharedPtr<T> sharedPtr = p.lock(); assign(sharedPtr.get()); return *this; }
47   SGWeakPtr& operator=(const SGWeakPtr& p)
48   { mWeakData = p.mWeakData; return *this; }
49
50   SGSharedPtr<T> lock(void) const
51   {
52     if (!mWeakData)
53       return SGSharedPtr<T>();
54     SGSharedPtr<T> sharedPtr;
55     sharedPtr.assignNonRef(mWeakData->getPointer<T>());
56     return sharedPtr;
57   }
58
59   void clear()
60   { mWeakData = 0; }
61   void swap(SGWeakPtr& weakPtr)
62   { mWeakData.swap(weakPtr.mWeakData); }
63
64 private:
65   void assign(T* p)
66   {
67     if (p)
68       mWeakData = p->mWeakData;
69     else
70       mWeakData = 0;
71   }
72   
73   // The indirect reference itself.
74   SGSharedPtr<SGWeakReferenced::WeakData> mWeakData;
75 };
76
77 #endif