8cabd9130b43362a8fbcc2590723ca612b76b626
[blender.git] / source / blender / freestyle / intern / system / BaseObject.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 #ifndef __FREESTYLE_BASE_OBJECT_H__
22 #define __FREESTYLE_BASE_OBJECT_H__
23
24 /** \file blender/freestyle/intern/system/BaseObject.h
25  *  \ingroup freestyle
26  *  \brief Base Class for most shared objects (Node, Rep). Defines the addRef, release system.
27  *  \brief Inspired by COM IUnknown system.
28  *  \author Stephane Grabli
29  *  \date 06/02/2002
30  */
31
32 #ifdef WITH_CXX_GUARDEDALLOC
33 #include "MEM_guardedalloc.h"
34 #endif
35
36 namespace Freestyle {
37
38 class BaseObject
39 {
40 public:
41         inline BaseObject()
42         {
43                 _ref_counter = 0;
44         }
45
46         virtual ~BaseObject() {}
47
48         /*! At least makes a release on this.
49          *  The BaseObject::destroy method must be explicitely called at the end of any overloaded destroy
50          */
51         virtual int destroy()
52         {
53                 return release();
54         }
55
56         /*! Increments the reference counter */
57         inline int addRef()
58         {
59                 return ++_ref_counter;
60         }
61
62         /*! Decrements the reference counter */
63         inline int release()
64         {
65                 if (_ref_counter)
66                         _ref_counter--;
67                 return _ref_counter;
68         }
69
70 private:
71         unsigned _ref_counter;
72
73 #ifdef WITH_CXX_GUARDEDALLOC
74         MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:BaseObject")
75 #endif
76 };
77
78 } /* namespace Freestyle */
79
80 #endif // __FREESTYLE_BASE_OBJECT_H__