Slicer 5.6
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkSingleton.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Library: CTK
4
5 Copyright (c) 2010 Kitware Inc.
6
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
10
11 https://www.commontk.org/LICENSE
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18
19=========================================================================*/
20
21#ifndef __vtkSingleton_h
22#define __vtkSingleton_h
23
33
34//-----------------------------------------------------------------------------
37#define VTK_SINGLETON_DECLARE(NAME) \
38typedef NAME Self; \
39static NAME* Instance; \
40static void classInitialize(); \
41static void classFinalize(); \
42friend class NAME##Initialize;
43
44//-----------------------------------------------------------------------------
53#define VTK_SINGLETON_DECLARE_INITIALIZER(EXPORT_DIRECTIVE,NAME) \
54class EXPORT_DIRECTIVE NAME##Initialize \
55{ \
56public: \
57 typedef NAME##Initialize Self; \
58 \
59 NAME##Initialize(); \
60 ~NAME##Initialize(); \
61private: \
62 static unsigned int Count; \
63}; \
64 \
65static NAME##Initialize NAME##Initializer;
66
67
68//-----------------------------------------------------------------------------
77#define VTK_SINGLETON_INITIALIZER_CXX(NAME) \
78NAME##Initialize::NAME##Initialize() \
79{ \
80 if(++Self::Count == 1) \
81 { NAME::classInitialize(); } \
82} \
83 \
84NAME##Initialize::~NAME##Initialize() \
85{ \
86 if(--Self::Count == 0) \
87 { NAME::classFinalize(); } \
88} \
89 \
90unsigned int NAME##Initialize::Count; \
91NAME* NAME::Instance;
92
93// TODO Would be great to have this macro working. that would avoid
94// to duplicate the following lines over and over
95//#define VTK_SINGLETON_GETINSTANCE_CXX(NAME)
96/* Up the reference count so it behaves like New */
97//NAME* NAME::New()
98//{
99// NAME* instance = Self::GetInstance();
100// instance->Register(0);
101// return instance;
102//}
103//NAME* NAME::GetInstance()
104//{
105// if(!Self::Instance)
106// {
107 /* Try the factory first */
108// Self::Instance = (NAME*)vtkObjectFactory::CreateInstance(#NAME);
109//
110 /* if the factory did not provide one, then create it here*/
111// if(!Self::Instance)
112// {
113 /* if the factory failed to create the object, */
114 /* then destroy it now, as vtkDebugLeaks::ConstructClass */
115 /* was called with "NAME", and not the real name of the class */
116//#ifdef VTK_DEBUG_LEAKS
117// vtkDebugLeaks::DestructClass(#NAME);
118//#endif
119// Self::Instance = new NAME;
120// }
121// }
122// return Self::Instance;
123//}
124
125//----------------------------------------------------------------------------
129#define VTK_SINGLETON_CXX(NAME) \
130void NAME::classInitialize() \
131{ \
132 Self::Instance = NAME::GetInstance(); \
133} \
134 \
135void NAME::classFinalize() \
136{ \
137 Self::Instance->Delete(); \
138 Self::Instance = 0; \
139} \
140 \
141VTK_SINGLETON_INITIALIZER_CXX(NAME)
142
144
145#endif