MeVisLab Toolbox Reference
mlITKObjectFactory.h
Go to the documentation of this file.
1/*************************************************************************************
2**
3** Copyright 2007, MeVis Medical Solutions AG
4**
5** The user may use this file in accordance with the license agreement provided with
6** the Software or, alternatively, in accordance with the terms contained in a
7** written agreement between the user and MeVis Medical Solutions AG.
8**
9** For further information use the contact form at https://www.mevislab.de/contact
10**
11**************************************************************************************/
12
13#pragma once
14
15#include <mlITKSupport.h>
16
17//-------------------------------------------------------------------------------------
26//-------------------------------------------------------------------------------------
27#define _ML_CREATE_ITK_OBJECT_VOID(ML_OUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
28{ \
29 return new CLASS_NAME<ITKINDATATYPE, DIM>(); \
30} \
31
32//-------------------------------------------------------------------------------------
40//-------------------------------------------------------------------------------------
41#define _ML_DESTROY_ITK_OBJECT_VOID(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
42{ \
43 delete static_cast<CLASS_NAME<ITKINDATATYPE, DIM>*>(itkFactoryObj); \
44} \
45
46
47//-------------------------------------------------------------------------------------
56//-------------------------------------------------------------------------------------
57#define _ML_CREATE_ITK_OBJECT_VOID_WO_DT(ML_OUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
58{ \
59 return new CLASS_NAME<DIM>(); \
60} \
61
62//-------------------------------------------------------------------------------------
70//-------------------------------------------------------------------------------------
71#define _ML_DESTROY_ITK_OBJECT_VOID_WO_DT(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
72{ \
73 delete static_cast<CLASS_NAME<DIM>*>(itkFactoryObj); \
74} \
75
76//-------------------------------------------------------------------------------------
83//-------------------------------------------------------------------------------------
84#define MLITKImplementFactoryFuncs(CLASS_NAME, NAMESPACE, NEW_FUNC, DEL_FUNC) \
85 /*--------------------------------------------------------------------*/ \
86 \
87 /*--------------------------------------------------------------------*/ \
88 static void *CLASS_NAME##Creator(MLDataType dType, unsigned int dim){ \
89 /* Call correct template version of object creation for all types and dims. */ \
90 ML_IMPLEMENT_ALL_ITK_6D_CASES("CLASS_NAME##creator())", \
91 NEW_FUNC, \
92 NAMESPACE::CLASS_NAME, dType, dim); \
93 return nullptr; /* Error */ \
94 } \
95 \
96 /*--------------------------------------------------------------------*/ \
97 \
98 \
99 /*--------------------------------------------------------------------*/ \
100 static void CLASS_NAME##Destructor(void *itkFactoryObj, MLDataType dType, unsigned int dim){ \
101 /* Call correct template version of object destruction for all types and dims. */ \
102 ML_IMPLEMENT_ALL_ITK_6D_CASES("CLASS_NAME##destructor()", \
103 DEL_FUNC, \
104 NAMESPACE::CLASS_NAME, dType, dim); \
105 } \
106
107
108/*---------------------------------------------------------------------------*/
114/*---------------------------------------------------------------------------*/
115#define MLITKObjectFactoryInit(FACTORY, CLASS_NAME) \
116 FACTORY._setCreatorAndDestructor(CLASS_NAME##Creator, CLASS_NAME##Destructor);
117
118
119ML_START_NAMESPACE
120
121/*---------------------------------------------------------------------------*/
126/*---------------------------------------------------------------------------*/
128{
129 public:
130
132 typedef void *(*MLITKObjectFactoryCreator)(MLDataType dataType, unsigned int dim);
133
135 typedef void (*MLITKObjectFactoryDestructor)(void *, MLDataType dataType, unsigned int dim);
136
138 MLITKObjectFactory(): _itkObjectVoid(nullptr), _dataType(ML_INVALID_DATA_TYPE), _dimension(0){ }
139
141 ~MLITKObjectFactory() { _destroyInternalObject(); }
142
144 void createObject(MLDataType dType, int dim) { _createInternalObject(dType, dim); }
145
147 void createObject(MLDataType dType, ImageVector v){ _createInternalObject(dType, v.getExtDimension()); }
148
150 void destroyObject() { _destroyInternalObject(); }
151
153 void *getObject() const { return _itkObjectVoid; }
154
156 MLDataType getDataType() const { return _dataType; }
157
159 unsigned int getDimension() const { return _dimension; }
160
164 {
165 _creatorFunc = cFunc;
166 _destructorFunc = dFunc;
167 }
168
169 private:
170
171 //-------------------------------------------
173 //-------------------------------------------
174
176 void _createInternalObject(MLDataType dataType, MLint dim)
177 {
178 // Remove existing object if there is one.
179 _destroyInternalObject();
180
181 // Check for valid data type and dimension.
182 if (!MLIsValidType(dataType) || (dim < 1) || (dim > 6)){
183 ML_PRINT_FATAL_ERROR("MLITKObjectFactory::_createInternalObject(MLDataType, int)",
184 ML_BAD_PARAMETER, "Not creating object.");
185 return;
186 }
187
188 ML_TRY
189 {
190 // Create object and store data type and dimension.
191 _itkObjectVoid = _creatorFunc(dataType, static_cast<unsigned int>(dim));
192 _dataType = dataType;
193 _dimension = static_cast<unsigned int>(dim);
194 }
195 ML_CATCH_BLOCK(...)
196 {
197 ML_PRINT_FATAL_ERROR("MLITKObjectFactory::_createInternalObject(MLDataType, int)",
199 _itkObjectVoid = nullptr;
200 _dataType = ML_INVALID_DATA_TYPE;
201 _dimension = 0;
202 }
203 }
204
206 void _destroyInternalObject()
207 {
208 if (_itkObjectVoid){
209 ML_TRY
210 {
211 _destructorFunc(_itkObjectVoid, _dataType, _dimension);
212 }
213 ML_CATCH_BLOCK(...)
214 {
215 ML_PRINT_ERROR("MLITKObjectFactory::_destroyInternalObject()", ML_UNKNOWN_EXCEPTION, "");
216 }
217
218 // Reset pointer and members.
219 _itkObjectVoid = nullptr;
220 _dataType = ML_INVALID_DATA_TYPE;
221 _dimension = 0;
222 }
223 }
224
226 MLITKObjectFactory(const MLITKObjectFactory &){}
227
229 MLITKObjectFactory &operator=(const MLITKObjectFactory &){ return *this; }
231
232
233 //-------------------------------------------
235 //-------------------------------------------
237 void *_itkObjectVoid;
238
240 MLDataType _dataType;
241
243 unsigned int _dimension;
244
246 MLITKObjectFactoryCreator _creatorFunc;
247
249 MLITKObjectFactoryDestructor _destructorFunc;
251};
252
253ML_END_NAMESPACE
~MLITKObjectFactory()
Destroy internally stored object.
MLDataType getDataType() const
Returns data type of the managed internal object.
void destroyObject()
Destroy object.
void _setCreatorAndDestructor(MLITKObjectFactoryCreator cFunc, MLITKObjectFactoryDestructor dFunc)
Sets creator and destructor functions. Only to be called by the macro.
unsigned int getDimension() const
Returns dimension of the managed internal object.
void * getObject() const
Returns void pointer to the managed internal object.
void createObject(MLDataType dType, ImageVector v)
Create object.
void(* MLITKObjectFactoryDestructor)(void *, MLDataType dataType, unsigned int dim)
Function type to destroy an object.
void createObject(MLDataType dType, int dim)
Create object.
void *(* MLITKObjectFactoryCreator)(MLDataType dataType, unsigned int dim)
Function type to cerate an object and to return a void pointer to it.
MLITKObjectFactory()
Create an empty object.
MLint getExtDimension() const
MLEXPORT MLint32 MLIsValidType(MLDataType dataType)
#define ML_INVALID_DATA_TYPE
Definition mlTypeDefs.h:612
MLint32 MLDataType
Definition mlTypeDefs.h:595
#define ML_BAD_PARAMETER
Definition mlTypeDefs.h:822
#define ML_UNKNOWN_EXCEPTION
Definition mlTypeDefs.h:729
#define ML_PRINT_FATAL_ERROR(FUNC_NAME, REASON, HANDLING)
#define ML_PRINT_ERROR(FUNC_NAME, REASON, HANDLING)
#define ML_CATCH_BLOCK(__paramType)
#define ML_TRY
#define MLITK_SUPPORT_EXPORT
MLint64 MLint
Definition mlTypeDefs.h:489
TImageVector< MLint > ImageVector
Defines the standard ImageVector type that is used by the ML for indexing and coordinates.