]> Creatis software - bbtk.git/blob - packages/itk/src/bbitkImage.h
*** empty log message ***
[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         return typeid(void);
348       }
349     return typeid(void);
350   }
351
352
353 #undef BBTK_GITIFPTI_DIM
354
355
356 ///
357 template <typename ValueType>
358 class TypeMapping
359 {
360 public:
361   TypeMapping() {}
362
363   template <typename T>
364   ValueType& value()
365   {
366     return m_map[ (void*)typeid(T).name() ];
367   }
368   template <typename T>
369   ValueType& operator[]( const T& )
370   {
371     return m_map[ (void*)typeid(T).name() ];
372   }
373
374   ValueType& operator[]( const std::type_info& t)
375   {
376     return m_map[ (void*)t.name() ];
377   }
378   
379   unsigned int size() const { return m_map.size(); }
380
381   typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
382
383   const_iterator begin() const { return m_map.begin(); }
384   const_iterator end() const { return m_map.end(); }
385
386 protected:
387   std::map<void*, ValueType> m_map;
388 };
389   
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>; 
415   
416   //=======================================================================
417
418
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; };
423
424   typedef bbtk::any<ImagePointer> anyImagePointer;
425
426   // Specialisations for instantiated image types 
427   // DIMENSION 2
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; };
431 #  endif
432 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
433   template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
434 #  endif
435 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
436   template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
437 #  endif
438 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
439   template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
440 #  endif
441 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
442   template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
443 #  endif
444 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
445   template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
446 #  endif
447 #  ifdef BBTK_ITK_IMAGE_TYPE_float
448   template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
449 #  endif
450 #  ifdef BBTK_ITK_IMAGE_TYPE_double
451   template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
452 #  endif
453 #endif
454
455
456
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; };
460 #  endif
461 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
462   template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
463 #  endif
464 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
465   template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
466 #  endif
467 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
468   template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
469 #  endif
470 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
471   template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
472 #  endif
473 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
474   template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
475 #  endif
476 #  ifdef BBTK_ITK_IMAGE_TYPE_float
477   template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
478 #  endif
479 #  ifdef BBTK_ITK_IMAGE_TYPE_double
480   template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
481 #  endif
482 #endif
483
484
485
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; };
489 #  endif
490 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
491   template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
492 #  endif
493 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
494   template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
495 #  endif
496 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
497   template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
498 #  endif
499 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
500   template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
501 #  endif
502 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
503   template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
504 #  endif
505 #  ifdef BBTK_ITK_IMAGE_TYPE_float
506   template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
507 #  endif
508 #  ifdef BBTK_ITK_IMAGE_TYPE_double
509   template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
510 #  endif
511 #endif
512
513
514 } // namespace bbitk
515
516 namespace bbtk
517 {
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");
521
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")
524
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"); \
531         return n; }                                                     \
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"); \
537         return n; }                                                     \
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"); \
543         return n; }                                                     \
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"); \
549         return n; }
550
551 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);                      
552
553 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
554
555         
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)
565   
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)
570   
571
572 } // namespace bbtk
573
574 #endif
575 #endif