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);
351 #undef BBTK_GITIFPTI_DIM
355 template <typename ValueType>
361 template <typename T>
364 return m_map[ (void*)typeid(T).name() ];
366 template <typename T>
367 ValueType& operator[]( const T& )
369 return m_map[ (void*)typeid(T).name() ];
372 ValueType& operator[]( const std::type_info& t)
374 return m_map[ (void*)t.name() ];
377 unsigned int size() const { return m_map.size(); }
379 typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
381 const_iterator begin() const { return m_map.begin(); }
382 const_iterator end() const { return m_map.end(); }
385 std::map<void*, ValueType> m_map;
388 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
389 MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
390 MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
391 MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
392 MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
393 MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
394 MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
395 MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
396 MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
397 MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
398 MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
399 MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
400 MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
401 MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
402 MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
403 MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
404 MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
405 MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
406 MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
407 MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
408 MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
409 MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
410 MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
411 MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
412 MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>;
414 //=======================================================================
417 //=======================================================================
418 // Type traits ImagePointer to define bbtk::any<ImagePointer>
419 /// The TypeTraits for all itk::Image pointer types
420 template <typename T> struct ImagePointer { static const bool value = false; };
422 typedef bbtk::any<ImagePointer> anyImagePointer;
424 // Specialisations for instantiated image types
426 #ifdef BBTK_ITK_IMAGE_DIM_2
427 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
428 template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
430 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
431 template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
433 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
434 template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
436 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
437 template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
439 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
440 template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
442 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
443 template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
445 # ifdef BBTK_ITK_IMAGE_TYPE_float
446 template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
448 # ifdef BBTK_ITK_IMAGE_TYPE_double
449 template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
455 #ifdef BBTK_ITK_IMAGE_DIM_3
456 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
457 template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
459 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
460 template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
462 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
463 template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
465 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
466 template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
468 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
469 template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
471 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
472 template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
474 # ifdef BBTK_ITK_IMAGE_TYPE_float
475 template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
477 # ifdef BBTK_ITK_IMAGE_TYPE_double
478 template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
484 #ifdef BBTK_ITK_IMAGE_DIM_4
485 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
486 template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
488 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
489 template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
491 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
492 template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
494 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
495 template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
497 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
498 template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
500 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
501 template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
503 # ifdef BBTK_ITK_IMAGE_TYPE_float
504 template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
506 # ifdef BBTK_ITK_IMAGE_TYPE_double
507 template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
516 BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
517 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
518 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
520 // Human readable names for itk images
521 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
523 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
524 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
525 { std::string n("itkImage"); \
526 n+= HumanTypeName<TYPE>();\
527 n += std::string(#DIM);\
528 n += std::string("ptr"); \
530 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &) \
531 { std::string n("itkImage");\
532 n+= HumanTypeName<TYPE>(); \
533 n += std::string(#DIM); \
534 n+= std::string("ptr"); \
536 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >() \
537 { std::string n("itkImage"); \
538 n+= HumanTypeName<TYPE>();\
539 n += std::string(#DIM);\
540 n += std::string("cptr"); \
542 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &) \
543 { std::string n("itkImage");\
544 n+= HumanTypeName<TYPE>(); \
545 n += std::string(#DIM); \
546 n+= std::string("cptr"); \
549 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);
551 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
554 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
555 BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM); \
556 BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
557 BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
558 BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM); \
559 BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
560 BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM); \
561 BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM); \
562 BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
564 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
565 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
566 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
567 //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)