3 #ifndef __BBITKIMAGE_H_INCLUDED__
4 #define __BBITKIMAGE_H_INCLUDED__
8 #include "bbtkSystem.h"
13 // bbtk typedefs for itk images
14 #define BBTK_TYPEDEF_ITK_IMAGE(TYPE,DIM) \
15 typedef itk::Image<TYPE,DIM> Image_##TYPE##_##DIM; \
16 typedef const Image_##TYPE##_##DIM Image_##TYPE##_##DIM##_c; \
17 typedef Image_##TYPE##_##DIM * Image_##TYPE##_##DIM##_ptr; \
18 typedef Image_##TYPE##_##DIM##_c * Image_##TYPE##_##DIM##_cptr;
21 #define BBTK_TYPEDEF_ITK_IMAGES_DIM(DIM) \
22 BBTK_TYPEDEF_ITK_IMAGE(int8_t,DIM); \
23 BBTK_TYPEDEF_ITK_IMAGE(uint8_t,DIM); \
24 BBTK_TYPEDEF_ITK_IMAGE(int16_t,DIM); \
25 BBTK_TYPEDEF_ITK_IMAGE(uint16_t,DIM); \
26 BBTK_TYPEDEF_ITK_IMAGE(int32_t,DIM); \
27 BBTK_TYPEDEF_ITK_IMAGE(uint32_t,DIM); \
28 BBTK_TYPEDEF_ITK_IMAGE(float,DIM); \
29 BBTK_TYPEDEF_ITK_IMAGE(double,DIM)
31 BBTK_TYPEDEF_ITK_IMAGES_DIM(2);
32 BBTK_TYPEDEF_ITK_IMAGES_DIM(3);
33 BBTK_TYPEDEF_ITK_IMAGES_DIM(4);
34 //BBTK_TYPEDEF_ITK_IMAGES_DIM(5)
38 #define BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) if (false) {}
40 #define BBTK_END_TEMPLATE_SWITCH(TYPE_INFO) else { bbtkError("bbtk was not built for itk images of type <"<< bbtk::demangle_type_name(TYPE_INFO.name())<<">"); }
42 #define BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,MESSAGE) else { bbtkError(MESSAGE); }
44 /// Generic macro which calls a TEMPLATE_FUNCTION instanciated
45 /// on TEMPLATE_TYPE iff TYPE_INFO == typeid(TEST_TYPE).
46 /// This macro must be used (maybe several times) between a pair of BEGIN_TEMPLATE_SWITCH and END_TEMPLATE_SWITCH macros
47 #define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE) \
48 else if (TYPE_INFO == typeid(bbitk::TEST_TYPE)) \
49 { TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
53 #ifdef BBTK_ITK_IMAGE_DIM_2
54 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
55 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST) \
56 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_2_##CONST##ptr,FUN,Image_int8_t_2)
58 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
60 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
61 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST) \
62 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_2_##CONST##ptr,FUN,Image_int16_t_2)
64 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
66 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
67 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST) \
68 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_2_##CONST##ptr,FUN,Image_int32_t_2)
70 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
72 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
73 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST) \
74 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_2_##CONST##ptr,FUN,Image_uint8_t_2)
76 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
78 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
79 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST) \
80 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_2_##CONST##ptr,FUN,Image_uint16_t_2)
82 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
84 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
85 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST) \
86 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_2_##CONST##ptr,FUN,Image_uint32_t_2)
88 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
90 # ifdef BBTK_ITK_IMAGE_TYPE_float
91 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST) \
92 TEMPLATE_SWITCH(TYPE_INFO,Image_float_2_##CONST##ptr,FUN,Image_float_2)
94 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
96 # ifdef BBTK_ITK_IMAGE_TYPE_double
97 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST) \
98 TEMPLATE_SWITCH(TYPE_INFO,Image_double_2_##CONST##ptr,FUN,Image_double_2)
100 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
103 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
104 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
105 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
106 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
107 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
108 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
109 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
110 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
115 #ifdef BBTK_ITK_IMAGE_DIM_3
116 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
117 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST) \
118 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_3_##CONST##ptr,FUN,Image_int8_t_3)
120 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
122 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
123 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST) \
124 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_3_##CONST##ptr,FUN,Image_int16_t_3)
126 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
128 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
129 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST) \
130 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_3_##CONST##ptr,FUN,Image_int32_t_3)
132 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
134 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
135 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST) \
136 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_3_##CONST##ptr,FUN,Image_uint8_t_3)
138 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
140 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
141 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST) \
142 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_3_##CONST##ptr,FUN,Image_uint16_t_3)
144 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
146 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
147 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST) \
148 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_3_##CONST##ptr,FUN,Image_uint32_t_3)
150 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
152 # ifdef BBTK_ITK_IMAGE_TYPE_float
153 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST) \
154 TEMPLATE_SWITCH(TYPE_INFO,Image_float_3_##CONST##ptr,FUN,Image_float_3)
156 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
158 # ifdef BBTK_ITK_IMAGE_TYPE_double
159 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST) \
160 TEMPLATE_SWITCH(TYPE_INFO,Image_double_3_##CONST##ptr,FUN,Image_double_3)
162 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
165 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
166 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
167 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
168 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
169 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
170 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
171 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
172 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
177 #ifdef BBTK_ITK_IMAGE_DIM_4
178 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
179 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST) \
180 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_4_##CONST##ptr,FUN,Image_int8_t_4)
182 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
184 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
185 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST) \
186 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_4_##CONST##ptr,FUN,Image_int16_t_4)
188 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
190 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
191 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST) \
192 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_4_##CONST##ptr,FUN,Image_int32_t_4)
194 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
196 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
197 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST) \
198 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_4_##CONST##ptr,FUN,Image_uint8_t_4)
200 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
202 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
203 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST) \
204 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_4_##CONST##ptr,FUN,Image_uint16_t_4)
206 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
208 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
209 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST) \
210 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_4_##CONST##ptr,FUN,Image_uint32_t_4)
212 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
214 # ifdef BBTK_ITK_IMAGE_TYPE_float
215 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST) \
216 TEMPLATE_SWITCH(TYPE_INFO,Image_float_4_##CONST##ptr,FUN,Image_float_4)
218 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
220 # ifdef BBTK_ITK_IMAGE_TYPE_double
221 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST) \
222 TEMPLATE_SWITCH(TYPE_INFO,Image_double_4_##CONST##ptr,FUN,Image_double_4)
224 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
227 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
228 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
229 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
230 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
231 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
232 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
233 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
234 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
238 /// General macro which calls the template function FUN instanciated
239 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
240 #define BBTK_TEMPLATE_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
241 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
242 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,) \
243 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,) \
244 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,) \
245 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,) \
246 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,) \
247 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,) \
248 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,) \
249 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,) \
250 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
251 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
252 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
253 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
254 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
255 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
256 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
257 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
258 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,) \
259 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,) \
260 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,) \
261 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,) \
262 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,) \
263 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,) \
264 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,) \
265 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,) \
266 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
268 /// General macro which calls the template function FUN instanciated
269 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
270 #define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
271 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
272 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
273 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
274 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
275 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
276 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
277 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
278 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
279 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
280 BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,ERROR_MESSAGE)
283 /// General macro which calls the template function FUN instanciated
284 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
286 #define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
287 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
288 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c) \
289 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c) \
290 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,c) \
291 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,c) \
292 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,c) \
293 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,c) \
294 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,c) \
295 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,c) \
296 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,c) \
297 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,c) \
298 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,c) \
299 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,c) \
300 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,c) \
301 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,c) \
302 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,c) \
303 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,c) \
304 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,c) \
305 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,c) \
306 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,c) \
307 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,c) \
308 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,c) \
309 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c) \
310 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c) \
311 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c) \
312 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
314 #define BBTK_GITIFPTI_DIM(DIM) \
315 if (pti == typeid(unsigned char)) \
316 return typeid(itk::Image<unsigned char,DIM>*); \
317 if (pti == typeid(unsigned short)) \
318 return typeid(itk::Image<unsigned short,DIM>*); \
319 if (pti == typeid(unsigned int)) \
320 return typeid(itk::Image<unsigned int,DIM>*); \
321 if (pti == typeid(unsigned long)) \
322 return typeid(itk::Image<unsigned long,DIM>*); \
323 if (pti == typeid(signed char)) \
324 return typeid(itk::Image<signed char,DIM>*); \
325 if (pti == typeid(signed short)) \
326 return typeid(itk::Image<signed short,DIM>*); \
327 if (pti == typeid(signed int)) \
328 return typeid(itk::Image<signed int,DIM>*); \
329 if (pti == typeid(signed long)) \
330 return typeid(itk::Image<signed long,DIM>*); \
331 if (pti == typeid(float)) \
332 return typeid(itk::Image<float,DIM>*); \
333 if (pti == typeid(double)) \
334 return typeid(itk::Image<double,DIM>*);
337 inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension(
341 if (dim==2) { BBTK_GITIFPTI_DIM(2); }
342 else if (dim==3) { BBTK_GITIFPTI_DIM(3); }
343 else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
346 //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
353 #undef BBTK_GITIFPTI_DIM
357 template <typename ValueType>
363 template <typename T>
366 return m_map[ (void*)typeid(T).name() ];
368 template <typename T>
369 ValueType& operator[]( const T& )
371 return m_map[ (void*)typeid(T).name() ];
374 ValueType& operator[]( const std::type_info& t)
376 return m_map[ (void*)t.name() ];
379 unsigned int size() const { return m_map.size(); }
381 typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
383 const_iterator begin() const { return m_map.begin(); }
384 const_iterator end() const { return m_map.end(); }
387 std::map<void*, ValueType> m_map;
390 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
391 MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
392 MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
393 MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
394 MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
395 MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
396 MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
397 MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
398 MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
399 MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
400 MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
401 MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
402 MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
403 MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
404 MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
405 MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
406 MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
407 MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
408 MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
409 MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
410 MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
411 MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
412 MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
413 MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
414 MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>;
416 //=======================================================================
419 //=======================================================================
420 // Type traits ImagePointer to define bbtk::any<ImagePointer>
421 /// The TypeTraits for all itk::Image pointer types
422 template <typename T> struct ImagePointer { static const bool value = false; };
424 typedef bbtk::any<ImagePointer> anyImagePointer;
426 // Specialisations for instantiated image types
428 #ifdef BBTK_ITK_IMAGE_DIM_2
429 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
430 template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
432 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
433 template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
435 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
436 template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
438 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
439 template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
441 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
442 template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
444 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
445 template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
447 # ifdef BBTK_ITK_IMAGE_TYPE_float
448 template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
450 # ifdef BBTK_ITK_IMAGE_TYPE_double
451 template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
457 #ifdef BBTK_ITK_IMAGE_DIM_3
458 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
459 template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
461 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
462 template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
464 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
465 template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
467 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
468 template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
470 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
471 template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
473 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
474 template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
476 # ifdef BBTK_ITK_IMAGE_TYPE_float
477 template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
479 # ifdef BBTK_ITK_IMAGE_TYPE_double
480 template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
486 #ifdef BBTK_ITK_IMAGE_DIM_4
487 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
488 template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
490 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
491 template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
493 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
494 template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
496 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
497 template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
499 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
500 template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
502 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
503 template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
505 # ifdef BBTK_ITK_IMAGE_TYPE_float
506 template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
508 # ifdef BBTK_ITK_IMAGE_TYPE_double
509 template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
518 BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
519 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
520 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
522 // Human readable names for itk images
523 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
525 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
526 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
527 { std::string n("itkImage"); \
528 n+= HumanTypeName<TYPE>();\
529 n += std::string(#DIM);\
530 n += std::string("ptr"); \
532 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &) \
533 { std::string n("itkImage");\
534 n+= HumanTypeName<TYPE>(); \
535 n += std::string(#DIM); \
536 n+= std::string("ptr"); \
538 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >() \
539 { std::string n("itkImage"); \
540 n+= HumanTypeName<TYPE>();\
541 n += std::string(#DIM);\
542 n += std::string("cptr"); \
544 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &) \
545 { std::string n("itkImage");\
546 n+= HumanTypeName<TYPE>(); \
547 n += std::string(#DIM); \
548 n+= std::string("cptr"); \
551 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);
553 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
556 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
557 BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM); \
558 BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
559 BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
560 BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM); \
561 BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
562 BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM); \
563 BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM); \
564 BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
566 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
567 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
568 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
569 //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)