[657] | 1 | /************************************************************************
|
---|
| 2 | filename: CEGUIRefPtr.h
|
---|
| 3 | created: 15/10/2004
|
---|
| 4 | author: Gerald Lindsly
|
---|
| 5 | *************************************************************************/
|
---|
| 6 | /*************************************************************************
|
---|
| 7 | Crazy Eddie's GUI System (http://www.cegui.org.uk)
|
---|
| 8 | Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk)
|
---|
| 9 |
|
---|
| 10 | This library is free software; you can redistribute it and/or
|
---|
| 11 | modify it under the terms of the GNU Lesser General Public
|
---|
| 12 | License as published by the Free Software Foundation; either
|
---|
| 13 | version 2.1 of the License, or (at your option) any later version.
|
---|
| 14 |
|
---|
| 15 | This library is distributed in the hope that it will be useful,
|
---|
| 16 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
| 18 | Lesser General Public License for more details.
|
---|
| 19 |
|
---|
| 20 | You should have received a copy of the GNU Lesser General Public
|
---|
| 21 | License along with this library; if not, write to the Free Software
|
---|
| 22 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
| 23 | *************************************************************************/
|
---|
| 24 | #ifndef _CEGUIRefPtr_h_
|
---|
| 25 | #define _CEGUIRefPtr_h_
|
---|
| 26 |
|
---|
| 27 | #include "CEGUIBase.h"
|
---|
| 28 |
|
---|
| 29 | namespace CEGUI {
|
---|
| 30 |
|
---|
| 31 | class CEGUIEXPORT Referenced
|
---|
| 32 | {
|
---|
| 33 | public:
|
---|
| 34 | Referenced() : d_refCount(0) {}
|
---|
| 35 | Referenced(const Referenced&) : d_refCount(0) {}
|
---|
| 36 |
|
---|
| 37 | Referenced& operator=(Referenced&) { return *this; }
|
---|
| 38 |
|
---|
| 39 | /* Increment the reference count by one, indicating that
|
---|
| 40 | a pointer to this object is referencing it. */
|
---|
| 41 | void addRef() const { ++d_refCount; }
|
---|
| 42 |
|
---|
| 43 | /* Decrement the reference count by one, indicating that
|
---|
| 44 | a pointer to this object is no longer referencing it.
|
---|
| 45 | if the count drops to zero, this is deleted. */
|
---|
| 46 | void release() const { if (!--d_refCount) delete this; }
|
---|
| 47 |
|
---|
| 48 | /* Decrement the reference count by one, indicating that
|
---|
| 49 | a pointer to this object is no longer referencing it;
|
---|
| 50 | however, do not delete it, even if ref count goes to 0. */
|
---|
| 51 | void releaseButKeep() const { --d_refCount; }
|
---|
| 52 |
|
---|
| 53 | /** return the number pointers currently referencing this object. */
|
---|
| 54 | int refCount() const { return d_refCount; }
|
---|
| 55 |
|
---|
| 56 | protected:
|
---|
| 57 | virtual ~Referenced();
|
---|
| 58 | mutable int d_refCount;
|
---|
| 59 | };
|
---|
| 60 |
|
---|
| 61 |
|
---|
| 62 | template<class T> class RefPtr
|
---|
| 63 | {
|
---|
| 64 | T* d_p;
|
---|
| 65 |
|
---|
| 66 | public:
|
---|
| 67 | // RefPtr() : d_p(0) {}
|
---|
| 68 |
|
---|
| 69 | RefPtr() : d_p(new T()) { d_p->addRef(); }
|
---|
| 70 |
|
---|
| 71 | RefPtr(T* t) : d_p(t) { if (t) d_p->addRef(); }
|
---|
| 72 | RefPtr(const RefPtr& r) : d_p(r.d_p)
|
---|
| 73 | { if (r.d_p) d_p->addRef(); }
|
---|
| 74 | ~RefPtr()
|
---|
| 75 | { if (d_p) {
|
---|
| 76 | d_p->release();
|
---|
| 77 | d_p = 0;
|
---|
| 78 | }
|
---|
| 79 | }
|
---|
| 80 |
|
---|
| 81 | RefPtr& operator=(T* q)
|
---|
| 82 | {
|
---|
| 83 | if (d_p != q) {
|
---|
| 84 | T* t = d_p;
|
---|
| 85 | d_p = q;
|
---|
| 86 | if (q) q->addRef();
|
---|
| 87 | if (t) t->release();
|
---|
| 88 | }
|
---|
| 89 | return *this;
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | RefPtr& operator=(const RefPtr& r) { return *this = r.d_p; }
|
---|
| 93 |
|
---|
| 94 | bool operator==(const RefPtr& r) const { return d_p == r.d_p; }
|
---|
| 95 | bool operator!=(const RefPtr& r) const { return d_p != r.d_p; }
|
---|
| 96 | bool operator< (const RefPtr& r) const { return d_p < r.d_p; }
|
---|
| 97 | bool operator> (const RefPtr& r) const { return d_p > r.d_p; }
|
---|
| 98 |
|
---|
| 99 | bool operator ==(const T* q) const { return d_p == q; }
|
---|
| 100 | bool operator !=(const T* q) const { return d_p != q; }
|
---|
| 101 | bool operator < (const T* q) const { return d_p < q; }
|
---|
| 102 | bool operator > (const T* q) const { return d_p > q; }
|
---|
| 103 |
|
---|
| 104 |
|
---|
| 105 | T& operator*() { return *d_p; }
|
---|
| 106 | const T& operator*() const { return *d_p; }
|
---|
| 107 |
|
---|
| 108 | T* operator->() { return d_p; }
|
---|
| 109 | const T* operator->() const { return d_p; }
|
---|
| 110 |
|
---|
| 111 | T* get() { return d_p; }
|
---|
| 112 | const T* get() const { return d_p; }
|
---|
| 113 |
|
---|
| 114 | bool operator!() const { return d_p == 0; }
|
---|
| 115 | bool valid() const { return d_p != 0; }
|
---|
| 116 |
|
---|
| 117 | T* release()
|
---|
| 118 | {
|
---|
| 119 | T* t = d_p;
|
---|
| 120 | if (d_p) {
|
---|
| 121 | d_p->releaseButKeep();
|
---|
| 122 | d_p = 0;
|
---|
| 123 | }
|
---|
| 124 | return t;
|
---|
| 125 | }
|
---|
| 126 | };
|
---|
| 127 |
|
---|
| 128 | } // end namespace CEGUI
|
---|
| 129 |
|
---|
| 130 | #endif
|
---|