- Revert to NaN makefiles
[blender.git] / intern / memutil / MEM_RefCounted.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31 /**
32  * @file        MEM_RefCounted.h
33  * Declaration of MEM_RefCounted class.
34  */
35
36 #ifndef _H_MEM_REF_COUNTED
37 #define _H_MEM_REF_COUNTED
38
39 /**
40  * An object with reference counting.
41  * Base class for objects with reference counting.
42  * When a shared object is ceated, it has reference count == 1.
43  * If the the reference count of a shared object reaches zero, the object self-destructs.
44  * The default destructor of this object has been made protected on purpose.
45  * This disables the creation of shared objects on the stack.
46  *
47  * @author      Maarten Gribnau
48  * @date        March 31, 2001
49  */
50
51 class MEM_RefCounted {
52 public:
53         /**
54          * Constructs a a shared object.
55          */
56         MEM_RefCounted() : m_refCount(1)
57         {
58         }
59
60         /** 
61          * Returns the reference count of this object.
62          * @return the reference count.
63          */
64         inline virtual int getRef() const;
65
66         /** 
67          * Increases the reference count of this object.
68          * @return the new reference count.
69          */
70         inline virtual int incRef();
71
72         /** 
73          * Decreases the reference count of this object.
74          * If the the reference count reaches zero, the object self-destructs.
75          * @return the new reference count.
76          */
77         inline virtual int decRef();
78
79 protected:
80         /**
81          * Destructs a shared object.
82          * The destructor is protected to force the use of incRef and decRef.
83          */
84         virtual ~MEM_RefCounted()
85         {
86         }
87
88 protected:
89         /// The reference count.
90         int m_refCount;
91 };
92
93
94 inline int MEM_RefCounted::getRef() const
95 {
96         return m_refCount;
97 }
98
99 inline int MEM_RefCounted::incRef()
100 {
101         return ++m_refCount;
102 }
103
104 inline int MEM_RefCounted::decRef()
105 {
106         m_refCount--;
107         if (m_refCount == 0) {
108                 delete this;
109                 return 0;
110         }
111         return m_refCount;
112 }
113
114 #endif // _H_MEM_REF_COUNTED
115