X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2FSGSharedPtr.hxx;h=c815a2fa566f94253282109ec6d5a76ce4489dad;hb=0908f867145683be76d2c26274451a44a7b1d5b0;hp=6b7c09d2a962dbc5e93057f5ae989c32e01c8ddb;hpb=8f9921d00c692573263a0215150e0892a9ffb68c;p=simgear.git diff --git a/simgear/structure/SGSharedPtr.hxx b/simgear/structure/SGSharedPtr.hxx index 6b7c09d2..c815a2fa 100644 --- a/simgear/structure/SGSharedPtr.hxx +++ b/simgear/structure/SGSharedPtr.hxx @@ -1,6 +1,6 @@ /* -*-c++-*- * - * Copyright (C) 2005-2006 Mathias Froehlich + * Copyright (C) 2005-2009 Mathias Froehlich * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ @@ -37,11 +37,14 @@ /// to zero and consequently the objects will never be destroyed. /// Always try to use directed graphs where the references away from the /// top node are made with SGSharedPtr's and the back references are done with -/// ordinary pointers. +/// ordinary pointers or SGWeakPtr's. /// There is a very good description of OpenSceneGraphs ref_ptr which is /// pretty much the same than this one at /// http://dburns.dhs.org/OSG/Articles/RefPointers/RefPointers.html +template +class SGWeakPtr; + template class SGSharedPtr { public: @@ -49,19 +52,19 @@ public: {} SGSharedPtr(T* ptr) : _ptr(ptr) { get(_ptr); } - SGSharedPtr(const SGSharedPtr& p) : _ptr(p.ptr()) + SGSharedPtr(const SGSharedPtr& p) : _ptr(p.get()) { get(_ptr); } template - SGSharedPtr(const SGSharedPtr& p) : _ptr(p.ptr()) + SGSharedPtr(const SGSharedPtr& p) : _ptr(p.get()) { get(_ptr); } ~SGSharedPtr(void) { put(); } SGSharedPtr& operator=(const SGSharedPtr& p) - { assign(p.ptr()); return *this; } + { assign(p.get()); return *this; } template SGSharedPtr& operator=(const SGSharedPtr& p) - { assign(p.ptr()); return *this; } + { assign(p.get()); return *this; } template SGSharedPtr& operator=(U* p) { assign(p); return *this; } @@ -74,26 +77,48 @@ public: { return _ptr; } T* ptr(void) const { return _ptr; } + T* get(void) const + { return _ptr; } + T* release() + { T* tmp = _ptr; _ptr = 0; T::put(tmp); return tmp; } bool isShared(void) const - { return SGReferenced::shared(_ptr); } + { return T::shared(_ptr); } unsigned getNumRefs(void) const - { return SGReferenced::count(_ptr); } + { return T::count(_ptr); } bool valid(void) const - { return _ptr; } + { return _ptr != (T*)0; } + + void clear() + { put(); } + void swap(SGSharedPtr& sharedPtr) + { T* tmp = _ptr; _ptr = sharedPtr._ptr; sharedPtr._ptr = tmp; } private: void assign(T* p) { get(p); put(); _ptr = p; } + void assignNonRef(T* p) + { put(); _ptr = p; } void get(const T* p) const - { SGReferenced::get(p); } + { T::get(p); } void put(void) - { if (!SGReferenced::put(_ptr)) { delete _ptr; _ptr = 0; } } + { if (!T::put(_ptr)) { delete _ptr; _ptr = 0; } } // The reference itself. T* _ptr; + + template + friend class SGWeakPtr; }; +/** + * Support for boost::mem_fn + */ +template +T* get_pointer(SGSharedPtr const & p) +{ + return p.ptr(); +} #endif