]> Creatis software - bbtk.git/blob - packages/itk/src/bbitkImage.h
88eea1af5f5bf80ce391580fd1e8bd07f8db1d04
[bbtk.git] / packages / itk / src / bbitkImage.h
1 #ifdef _USE_ITK_
2
3 #ifndef __BBITKIMAGE_H_INCLUDED__
4 #define __BBITKIMAGE_H_INCLUDED__
5
6 #include "itkImage.h"
7 #include "bbtkAny.h"
8 #include "bbtkSystem.h"
9
10 namespace bbitk
11 {
12   
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;       
19
20
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)
30   
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)
35   
36   
37   
38 #define BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) if (false) {}
39   
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())<<">"); }
41
42 #define BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,MESSAGE) else { bbtkError(MESSAGE); }
43   
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>(); }
50   
51   
52 // DIMENSION 2
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)
57 #  else
58 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
59 #  endif
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)
63 #  else
64 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
65 #  endif
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)
69 #  else
70 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
71 #  endif
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)
75 #  else
76 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
77 #  endif
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)
81 #  else
82 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
83 #  endif
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)
87 #  else
88 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
89 #  endif
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)
93 #  else
94 #    define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
95 #  endif
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)
99 #  else
100 #    define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
101 #  endif
102 #else
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)
111 #endif
112
113
114 // DIMENSION 3
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)
119 #  else
120 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
121 #  endif
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)
125 #  else
126 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
127 #  endif
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)
131 #  else
132 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
133 #  endif
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)
137 #  else
138 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
139 #  endif
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)
143 #  else
144 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
145 #  endif
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)
149 #  else
150 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
151 #  endif
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)
155 #  else
156 #    define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
157 #  endif
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)
161 #  else
162 #    define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
163 #  endif
164 #else
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)
173 #endif
174   
175   
176   // DIMENSION 4
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)
181 #  else
182 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
183 #  endif
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)
187 #  else
188 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
189 #  endif
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)
193 #  else
194 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
195 #  endif
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)
199 #  else
200 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
201 #  endif
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)
205 #  else
206 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
207 #  endif
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)
211 #  else
212 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
213 #  endif
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)
217 #  else
218 #    define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
219 #  endif
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)
223 #  else
224 #    define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
225 #  endif
226 #else
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)
235 #endif
236
237   
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)                        
267
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)
281
282
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). 
285   
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)                        
313    
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>*);                           
335   
336
337   inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension( 
338                                                                             bbtk::TypeInfo pti,
339                                                                             unsigned int dim )
340   {
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); }
344     else 
345       {
346                 //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
347       }
348   }
349
350
351 #undef BBTK_GITIFPTI_DIM
352
353
354 ///
355 template <typename ValueType>
356 class TypeMapping
357 {
358 public:
359   TypeMapping() {}
360
361   template <typename T>
362   ValueType& value()
363   {
364     return m_map[ (void*)typeid(T).name() ];
365   }
366   template <typename T>
367   ValueType& operator[]( const T& )
368   {
369     return m_map[ (void*)typeid(T).name() ];
370   }
371
372   ValueType& operator[]( const std::type_info& t)
373   {
374     return m_map[ (void*)t.name() ];
375   }
376   
377   unsigned int size() const { return m_map.size(); }
378
379   typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
380
381   const_iterator begin() const { return m_map.begin(); }
382   const_iterator end() const { return m_map.end(); }
383
384 protected:
385   std::map<void*, ValueType> m_map;
386 };
387   
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>; 
413   
414   //=======================================================================
415
416
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; };
421
422   typedef bbtk::any<ImagePointer> anyImagePointer;
423
424   // Specialisations for instantiated image types 
425   // DIMENSION 2
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; };
429 #  endif
430 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
431   template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
432 #  endif
433 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
434   template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
435 #  endif
436 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
437   template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
438 #  endif
439 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
440   template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
441 #  endif
442 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
443   template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
444 #  endif
445 #  ifdef BBTK_ITK_IMAGE_TYPE_float
446   template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
447 #  endif
448 #  ifdef BBTK_ITK_IMAGE_TYPE_double
449   template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
450 #  endif
451 #endif
452
453
454
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; };
458 #  endif
459 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
460   template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
461 #  endif
462 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
463   template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
464 #  endif
465 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
466   template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
467 #  endif
468 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
469   template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
470 #  endif
471 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
472   template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
473 #  endif
474 #  ifdef BBTK_ITK_IMAGE_TYPE_float
475   template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
476 #  endif
477 #  ifdef BBTK_ITK_IMAGE_TYPE_double
478   template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
479 #  endif
480 #endif
481
482
483
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; };
487 #  endif
488 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
489   template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
490 #  endif
491 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
492   template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
493 #  endif
494 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
495   template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
496 #  endif
497 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
498   template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
499 #  endif
500 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
501   template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
502 #  endif
503 #  ifdef BBTK_ITK_IMAGE_TYPE_float
504   template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
505 #  endif
506 #  ifdef BBTK_ITK_IMAGE_TYPE_double
507   template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
508 #  endif
509 #endif
510
511
512 } // namespace bbitk
513
514 namespace bbtk
515 {
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");
519
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")
522
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"); \
529         return n; }                                                     \
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"); \
535         return n; }                                                     \
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"); \
541         return n; }                                                     \
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"); \
547         return n; }
548
549 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);                      
550
551 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
552
553         
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)
563   
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)
568   
569
570 } // namespace bbtk
571
572 #endif
573 #endif