ITK  5.3.0
Insight Toolkit
itkObjectFactoryBase.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * https://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 /*=========================================================================
19  *
20  * Portions of this file are subject to the VTK Toolkit Version 3 copyright.
21  *
22  * Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
23  *
24  * For complete copyright, license and disclaimer of warranty information
25  * please refer to the NOTICE file at the top of the ITK source tree.
26  *
27  *=========================================================================*/
28 #ifndef itkObjectFactoryBase_h
29 #define itkObjectFactoryBase_h
30 
32 #include "itkSingletonMacro.h"
33 #include "itkCommonEnums.h"
34 #include <list>
35 #include <memory> // For unique_ptr.
36 #include <vector>
37 
38 namespace itk
39 {
59 class ITKCommon_EXPORT ObjectFactoryBase : public Object
60 {
61 public:
62  ITK_DISALLOW_COPY_AND_MOVE(ObjectFactoryBase);
63 
66  using Superclass = Object;
69 
71  itkTypeMacro(ObjectFactoryBase, Object);
72 
78  CreateInstance(const char * itkclassname);
79 
84  static std::list<LightObject::Pointer>
85  CreateAllInstance(const char * itkclassname);
86 
89  static void
90  ReHash();
91 
99  static void
100  RegisterFactoryInternal(ObjectFactoryBase *);
101 
103 #if !defined(ITK_LEGACY_REMOVE)
104  // We need to expose the enum values at the class level
105  // for backwards compatibility
106  static constexpr InsertionPositionEnum INSERT_AT_FRONT = InsertionPositionEnum::INSERT_AT_FRONT;
107  static constexpr InsertionPositionEnum INSERT_AT_BACK = InsertionPositionEnum::INSERT_AT_BACK;
108  static constexpr InsertionPositionEnum INSERT_AT_POSITION = InsertionPositionEnum::INSERT_AT_POSITION;
109 #endif
110 
129  static bool
130  RegisterFactory(ObjectFactoryBase *,
131  InsertionPositionEnum where = InsertionPositionEnum::INSERT_AT_BACK,
132  size_t position = 0);
136  static void
137  UnRegisterFactory(ObjectFactoryBase *);
138 
140  static void
141  UnRegisterAllFactories();
142 
145  static std::list<ObjectFactoryBase *>
146  GetRegisteredFactories();
147 
153  virtual const char *
154  GetITKSourceVersion() const = 0;
155 
161  static void
162  SetStrictVersionChecking(bool);
163  static void
164  StrictVersionCheckingOn();
165  static void
166  StrictVersionCheckingOff();
167  static bool
168  GetStrictVersionChecking();
172  virtual const char *
173  GetDescription() const = 0;
174 
176  virtual std::list<std::string>
177  GetClassOverrideNames();
178 
180  virtual std::list<std::string>
181  GetClassOverrideWithNames();
182 
184  virtual std::list<std::string>
185  GetClassOverrideDescriptions();
186 
188  virtual std::list<bool>
189  GetEnableFlags();
190 
192  virtual void
193  SetEnableFlag(bool flag, const char * className, const char * subclassName);
194 
196  virtual bool
197  GetEnableFlag(const char * className, const char * subclassName);
198 
202  virtual void
203  Disable(const char * className);
204 
206  const char *
207  GetLibraryPath();
208 
214  {
215  std::string m_Description;
216  std::string m_OverrideWithName;
219  };
220 
223  template <typename TFactory>
224  static void
226  {
227  struct FactoryRegistration
228  {};
229 
230  // Factory registration, made thread-safe by "magic statics" (as introduced with C++11).
231  static const FactoryRegistration staticFactoryRegistration = [] {
232  RegisterFactoryInternal(TFactory::New());
233  return FactoryRegistration{};
234  }();
235 
236  (void)staticFactoryRegistration;
237  }
238 
241  static void
242  Initialize();
243 
244 protected:
245  void
246  PrintSelf(std::ostream & os, Indent indent) const override;
247 
249  void
250  RegisterOverride(const char * classOverride,
251  const char * subclass,
252  const char * description,
253  bool enableFlag,
254  CreateObjectFunctionBase * createFunction);
255 
259  virtual LightObject::Pointer
260  CreateObject(const char * itkclassname);
261 
265  virtual std::list<LightObject::Pointer>
266  CreateAllObject(const char * itkclassname);
267 
269  ~ObjectFactoryBase() override;
270 
271 private:
272  // Forward reference because of private implementation
273  class OverrideMap;
274  class ObjectFactoryBasePrivate;
275 
278  static void
279  SynchronizeObjectFactoryBase(void * objectFactoryBasePrivate);
280  itkGetGlobalDeclarationMacro(ObjectFactoryBasePrivate, PimplGlobals);
283  const std::unique_ptr<OverrideMap> m_OverrideMap;
284 
286  static void
287  InitializeFactoryList();
288 
290  static void
291  RegisterInternal();
292 
294  static void
295  LoadDynamicFactories();
296 
298  static void
299  LoadLibrariesInPath(const char *);
300 
301  static void
302  DeleteNonInternalFactory(ObjectFactoryBase *);
303 
307  unsigned long m_LibraryDate;
308  std::string m_LibraryPath;
309 
310  static ObjectFactoryBasePrivate * m_PimplGlobals;
311 };
312 } // end namespace itk
313 
314 #endif
itkCreateObjectFunction.h
itk::ObjectFactoryBase
Create instances of classes using an object factory.
Definition: itkObjectFactoryBase.h:59
itk::ObjectFactoryBase::m_LibraryPath
std::string m_LibraryPath
Definition: itkObjectFactoryBase.h:308
itk::ObjectFactoryBase::OverrideInformation
Internal implementation class for ObjectFactorBase.
Definition: itkObjectFactoryBase.h:213
itk::ObjectFactoryBase::OverrideInformation::m_OverrideWithName
std::string m_OverrideWithName
Definition: itkObjectFactoryBase.h:216
itk::ObjectFactoryBase::m_LibraryDate
unsigned long m_LibraryDate
Definition: itkObjectFactoryBase.h:307
itk::ObjectFactoryBase::OverrideInformation::m_EnabledFlag
bool m_EnabledFlag
Definition: itkObjectFactoryBase.h:217
itkSingletonMacro.h
itk::SmartPointer< Self >
itk::Indent
Control indentation during Print() invocation.
Definition: itkIndent.h:49
itk::CreateObjectFunctionBase
Define API for object creation callback functions.
Definition: itkCreateObjectFunction.h:31
itk::LightObject
Light weight base class for most itk classes.
Definition: itkLightObject.h:55
itk::ObjectFactoryBase::OverrideInformation::m_Description
std::string m_Description
Definition: itkObjectFactoryBase.h:215
itk::ObjectFactoryBase::m_LibraryHandle
void * m_LibraryHandle
Definition: itkObjectFactoryBase.h:306
itk::ObjectFactoryBase::OverrideInformation::m_CreateObject
CreateObjectFunctionBase::Pointer m_CreateObject
Definition: itkObjectFactoryBase.h:218
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itk::ObjectFactoryBase::m_PimplGlobals
static ObjectFactoryBasePrivate * m_PimplGlobals
Definition: itkObjectFactoryBase.h:310
itk::ObjectFactoryBase::m_OverrideMap
const std::unique_ptr< OverrideMap > m_OverrideMap
Definition: itkObjectFactoryBase.h:283
itkCommonEnums.h
itkGetGlobalDeclarationMacro
#define itkGetGlobalDeclarationMacro(Type, VarName)
Definition: itkSingletonMacro.h:35
itk::Object
Base class for most ITK classes.
Definition: itkObject.h:61
itk::ObjectFactoryEnums::InsertionPosition
InsertionPosition
Definition: itkCommonEnums.h:280
New
static Pointer New()
itk::ObjectFactoryBase::RegisterInternalFactoryOnce
static void RegisterInternalFactoryOnce()
Definition: itkObjectFactoryBase.h:225