]> Creatis software - bbtk.git/blob - packages/itk/src/bbitkImage.h
3480 Bug typeid in Macos
[bbtk.git] / packages / itk / src / bbitkImage.h
1 /*
2  # ---------------------------------------------------------------------
3  #
4  # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5  #                        pour la SantÈ)
6  # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7  # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8  # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9  #
10  #  This software is governed by the CeCILL-B license under French law and
11  #  abiding by the rules of distribution of free software. You can  use,
12  #  modify and/ or redistribute the software under the terms of the CeCILL-B
13  #  license as circulated by CEA, CNRS and INRIA at the following URL
14  #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15  #  or in the file LICENSE.txt.
16  #
17  #  As a counterpart to the access to the source code and  rights to copy,
18  #  modify and redistribute granted by the license, users are provided only
19  #  with a limited warranty  and the software's author,  the holder of the
20  #  economic rights,  and the successive licensors  have only  limited
21  #  liability.
22  #
23  #  The fact that you are presently reading this means that you have had
24  #  knowledge of the CeCILL-B license and that you accept its terms.
25  # ------------------------------------------------------------------------ */
26
27
28 /*=========================================================================
29   Program:   bbtk
30   Module:    $RCSfile: bbitkImage.h,v $
31   Language:  C++
32   Date:      $Date: 2012/11/16 08:50:39 $
33   Version:   $Revision: 1.9 $
34 =========================================================================*/
35
36
37
38
39 #ifdef _USE_ITK_
40
41 #ifndef __BBITKIMAGE_H_INCLUDED__
42 #define __BBITKIMAGE_H_INCLUDED__
43
44 #include "itkImage.h"
45 #include "bbtkAny.h"
46 #include "bbtkSystem.h"
47
48 namespace bbitk
49 {
50
51   // bbtk typedefs for itk images
52 #define BBTK_TYPEDEF_ITK_IMAGE(TYPE,DIM)                                \
53   typedef itk::Image<TYPE,DIM> Image_##TYPE##_##DIM;                    \
54     typedef const Image_##TYPE##_##DIM Image_##TYPE##_##DIM##_c;        \
55   typedef Image_##TYPE##_##DIM * Image_##TYPE##_##DIM##_ptr;            \
56   typedef Image_##TYPE##_##DIM##_c * Image_##TYPE##_##DIM##_cptr;
57
58
59 #define BBTK_TYPEDEF_ITK_IMAGES_DIM(DIM)        \
60   BBTK_TYPEDEF_ITK_IMAGE(int8_t,DIM);           \
61     BBTK_TYPEDEF_ITK_IMAGE(uint8_t,DIM);        \
62     BBTK_TYPEDEF_ITK_IMAGE(int16_t,DIM);        \
63     BBTK_TYPEDEF_ITK_IMAGE(uint16_t,DIM);       \
64     BBTK_TYPEDEF_ITK_IMAGE(int32_t,DIM);        \
65     BBTK_TYPEDEF_ITK_IMAGE(uint32_t,DIM);       \
66     BBTK_TYPEDEF_ITK_IMAGE(float,DIM);          \
67     BBTK_TYPEDEF_ITK_IMAGE(double,DIM)
68  
69   BBTK_TYPEDEF_ITK_IMAGES_DIM(2);
70   BBTK_TYPEDEF_ITK_IMAGES_DIM(3);
71   BBTK_TYPEDEF_ITK_IMAGES_DIM(4);
72   //BBTK_TYPEDEF_ITK_IMAGES_DIM(5)
73
74
75
76 #define BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO)  \
77 if (false) {}
78
79 #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())<<">"); }
80
81 #define BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,MESSAGE) else { bbtkError(MESSAGE); }
82
83   /// Generic macro which calls a TEMPLATE_FUNCTION instanciated 
84   /// on TEMPLATE_TYPE iff TYPE_INFO == typeid(TEST_TYPE).
85   /// This macro must be used (maybe several times) between a pair of BEGIN_TEMPLATE_SWITCH and END_TEMPLATE_SWITCH macros
86
87
88 //EED 2021-12-15 typeid comparation is not working in MacOs for objects declared  in different libraries
89 // ex: itk <-> vtk templates convertion
90 #if defined(MACOSX)
91    #define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE)            \
92        else if ( strcmp(TYPE_INFO.name()  , typeid(bbitk::TEST_TYPE).name() ) ==0 )        \
93        { TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
94 #else
95    #define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE)            \
96        else if (TYPE_INFO == typeid(bbitk::TEST_TYPE))                                     \
97        { TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
98 #endif
99
100
101 // DIMENSION 2
102 #ifdef BBTK_ITK_IMAGE_DIM_2
103 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t
104 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)                 \
105   TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_2_##CONST##ptr,FUN,Image_int8_t_2)
106 #  else
107 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
108 #  endif
109 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t
110 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)                \
111   TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_2_##CONST##ptr,FUN,Image_int16_t_2)
112 #  else
113 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
114 #  endif
115 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t
116 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)                \
117   TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_2_##CONST##ptr,FUN,Image_int32_t_2)
118 #  else
119 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
120 #  endif
121 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
122 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)                \
123   TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_2_##CONST##ptr,FUN,Image_uint8_t_2)
124 #  else
125 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
126 #  endif
127 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
128 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)               \
129   TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_2_##CONST##ptr,FUN,Image_uint16_t_2)
130 #  else
131 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
132 #  endif
133 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
134 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)               \
135   TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_2_##CONST##ptr,FUN,Image_uint32_t_2)
136 #  else
137 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
138 #  endif
139 #  ifdef BBTK_ITK_IMAGE_TYPE_float
140 #    define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)                  \
141   TEMPLATE_SWITCH(TYPE_INFO,Image_float_2_##CONST##ptr,FUN,Image_float_2)
142 #  else
143 #    define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
144 #  endif
145 #  ifdef BBTK_ITK_IMAGE_TYPE_double
146 #    define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)                 \
147   TEMPLATE_SWITCH(TYPE_INFO,Image_double_2_##CONST##ptr,FUN,Image_double_2)
148 #  else
149 #    define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
150 #  endif
151 #else
152 #  define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST) 
153 #  define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
154 #  define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
155 #  define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
156 #  define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
157 #  define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
158 #  define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
159 #  define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
160 #endif
161
162 // DIMENSION 3
163 #ifdef BBTK_ITK_IMAGE_DIM_3
164 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
165 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)                 \
166   TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_3_##CONST##ptr,FUN,Image_int8_t_3)
167 #  else
168 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
169 #  endif
170 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t
171 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)                \
172   TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_3_##CONST##ptr,FUN,Image_int16_t_3)
173 #  else
174 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
175 #  endif
176 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t
177 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)                \
178   TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_3_##CONST##ptr,FUN,Image_int32_t_3)
179 #  else
180 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
181 #  endif
182 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
183 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)                \
184   TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_3_##CONST##ptr,FUN,Image_uint8_t_3)
185 #  else
186 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
187 #  endif
188 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
189 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)               \
190   TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_3_##CONST##ptr,FUN,Image_uint16_t_3)
191 #  else
192 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
193 #  endif
194 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
195 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)               \
196   TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_3_##CONST##ptr,FUN,Image_uint32_t_3)
197 #  else
198 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
199 #  endif
200 #  ifdef BBTK_ITK_IMAGE_TYPE_float
201 #    define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)                  \
202   TEMPLATE_SWITCH(TYPE_INFO,Image_float_3_##CONST##ptr,FUN,Image_float_3)
203 #  else
204 #    define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
205 #  endif
206 #  ifdef BBTK_ITK_IMAGE_TYPE_double
207 #    define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)                 \
208   TEMPLATE_SWITCH(TYPE_INFO,Image_double_3_##CONST##ptr,FUN,Image_double_3)
209 #  else
210 #    define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
211 #  endif
212 #else
213 #  define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
214 #  define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
215 #  define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
216 #  define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
217 #  define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
218 #  define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
219 #  define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
220 #  define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
221 #endif
222
223   // DIMENSION 4
224 #ifdef BBTK_ITK_IMAGE_DIM_4
225 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
226 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)                 \
227   TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_4_##CONST##ptr,FUN,Image_int8_t_4)
228 #  else
229 #    define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
230 #  endif
231 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t
232 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)                \
233   TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_4_##CONST##ptr,FUN,Image_int16_t_4)
234 #  else
235 #    define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
236 #  endif
237 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t
238 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)                \
239   TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_4_##CONST##ptr,FUN,Image_int32_t_4)
240 #  else
241 #    define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
242 #  endif
243 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
244 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)                \
245   TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_4_##CONST##ptr,FUN,Image_uint8_t_4)
246 #  else
247 #    define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
248 #  endif
249 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
250 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)               \
251   TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_4_##CONST##ptr,FUN,Image_uint16_t_4)
252 #  else
253 #    define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
254 #  endif
255 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
256 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)               \
257   TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_4_##CONST##ptr,FUN,Image_uint32_t_4)
258 #  else
259 #    define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
260 #  endif
261 #  ifdef BBTK_ITK_IMAGE_TYPE_float
262 #    define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)                  \
263   TEMPLATE_SWITCH(TYPE_INFO,Image_float_4_##CONST##ptr,FUN,Image_float_4)
264 #  else
265 #    define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
266 #  endif
267 #  ifdef BBTK_ITK_IMAGE_TYPE_double
268 #    define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)                 \
269   TEMPLATE_SWITCH(TYPE_INFO,Image_double_4_##CONST##ptr,FUN,Image_double_4)
270 #  else
271 #    define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
272 #  endif
273 #else
274 #  define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST) 
275 #  define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
276 #  define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
277 #  define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
278 #  define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
279 #  define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
280 #  define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
281 #  define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
282 #endif
283
284
285   /// General macro which calls the template function FUN instanciated 
286   /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info). 
287 #define BBTK_TEMPLATE_ITK_IMAGE_SWITCH(TYPE_INFO,FUN)   \
288   BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO)                 \
289     BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,)      \
290     BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,)     \
291     BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,)     \
292     BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,)     \
293     BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,)    \
294     BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,)    \
295     BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,)       \
296     BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,)      \
297     BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,)      \
298     BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,)     \
299     BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,)     \
300     BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,)     \
301     BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,)    \
302     BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,)    \
303     BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,)       \
304     BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,)      \
305     BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,)      \
306     BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,)     \
307     BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,)     \
308     BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,)     \
309     BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,)    \
310     BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,)    \
311     BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,)       \
312     BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,)      \
313   BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
314
315
316
317   /// General macro which calls the template function FUN instanciated 
318   /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info). 
319 #define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
320   BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO)                 \
321     BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,)      \
322     BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,)     \
323     BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,)     \
324     BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,)     \
325     BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,)    \
326     BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,)    \
327     BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,)       \
328     BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,)      \
329   BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,ERROR_MESSAGE)
330
331
332   /// General macro which calls the template function FUN instanciated 
333   /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info). 
334
335 #define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
336   BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO)                 \
337     BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c)     \
338     BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c)    \
339     BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,c)    \
340     BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,c)    \
341     BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,c)   \
342     BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,c)   \
343     BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,c)      \
344     BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,c)     \
345     BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,c)     \
346     BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,c)    \
347     BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,c)    \
348     BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,c)    \
349     BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,c)   \
350     BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,c)   \
351     BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,c)      \
352     BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,c)     \
353     BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,c)     \
354     BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,c)    \
355     BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,c)    \
356     BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,c)    \
357     BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,c)   \
358     BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c)   \
359     BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c)      \
360     BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c)     \
361   BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)      
362
363 #define BBTK_GITIFPTI_DIM(DIM)                          \
364   if (pti == typeid(unsigned char))                     \
365     return typeid(itk::Image<unsigned char,DIM>*);      \
366     if (pti == typeid(unsigned short))                  \
367       return typeid(itk::Image<unsigned short,DIM>*);   \
368     if (pti == typeid(unsigned int))                    \
369       return typeid(itk::Image<unsigned int,DIM>*);     \
370     if (pti == typeid(unsigned long))                   \
371       return typeid(itk::Image<unsigned long,DIM>*);    \
372     if (pti == typeid(signed char))                     \
373       return typeid(itk::Image<signed char,DIM>*);      \
374     if (pti == typeid(signed short))                    \
375       return typeid(itk::Image<signed short,DIM>*);     \
376     if (pti == typeid(signed int))                      \
377       return typeid(itk::Image<signed int,DIM>*);       \
378     if (pti == typeid(signed long))                     \
379       return typeid(itk::Image<signed long,DIM>*);      \
380     if (pti == typeid(float))                           \
381       return typeid(itk::Image<float,DIM>*);            \
382     if (pti == typeid(double))                          \
383       return typeid(itk::Image<double,DIM>*);
384
385
386   inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension( 
387                                                                             bbtk::TypeInfo pti,
388                                                                             unsigned int dim )
389   {
390     if      (dim==2) { BBTK_GITIFPTI_DIM(2); }
391     else if (dim==3) { BBTK_GITIFPTI_DIM(3); }
392     else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
393     else 
394       {
395         //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
396         return typeid(void);
397       }
398     return typeid(void);
399   }
400
401
402 #undef BBTK_GITIFPTI_DIM
403
404
405 ///
406 template <typename ValueType>
407 class TypeMapping
408 {
409 public:
410   TypeMapping() {}
411
412   template <typename T>
413   ValueType& value()
414   {
415     return m_map[ (void*)typeid(T).name() ];
416   }
417   template <typename T>
418   ValueType& operator[]( const T& )
419   {
420     return m_map[ (void*)typeid(T).name() ];
421   }
422
423   ValueType& operator[]( const std::type_info& t)
424   {
425     return m_map[ (void*)t.name() ];
426   }
427   
428   unsigned int size() const { return m_map.size(); }
429
430   typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
431
432   const_iterator begin() const { return m_map.begin(); }
433   const_iterator end() const { return m_map.end(); }
434
435 protected:
436   std::map<void*, ValueType> m_map;
437 };
438
439 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN)                         \
440     MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>;     \
441     MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>;   \
442     MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>;   \
443     MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>;   \
444     MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
445     MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
446     MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>;       \
447     MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>;     \
448     MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>;     \
449     MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>;   \
450     MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>;   \
451     MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>;   \
452     MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
453     MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
454     MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>;       \
455     MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>;     \
456     MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>;     \
457     MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>;   \
458     MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>;   \
459     MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>;   \
460     MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
461     MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
462     MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>;       \
463     MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>; 
464
465   //=======================================================================
466
467
468   //=======================================================================
469   // Type traits ImagePointer to define bbtk::any<ImagePointer>
470   /// The TypeTraits for all itk::Image pointer types 
471   template <typename T> struct ImagePointer { static const bool value = false; };
472
473   typedef bbtk::any<ImagePointer> anyImagePointer;
474
475   // Specialisations for instantiated image types 
476   // DIMENSION 2
477 #ifdef BBTK_ITK_IMAGE_DIM_2
478 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
479   template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
480 #  endif
481 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
482   template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
483 #  endif
484 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
485   template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
486 #  endif
487 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
488   template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
489 #  endif
490 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
491   template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
492 #  endif
493 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
494   template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
495 #  endif
496 #  ifdef BBTK_ITK_IMAGE_TYPE_float
497   template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
498 #  endif
499 #  ifdef BBTK_ITK_IMAGE_TYPE_double
500   template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
501 #  endif
502 #endif
503
504
505
506 #ifdef BBTK_ITK_IMAGE_DIM_3
507 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
508   template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
509 #  endif
510 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
511   template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
512 #  endif
513 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
514   template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
515 #  endif
516 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
517   template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
518 #  endif
519 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
520   template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
521 #  endif
522 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
523   template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
524 #  endif
525 #  ifdef BBTK_ITK_IMAGE_TYPE_float
526   template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
527 #  endif
528 #  ifdef BBTK_ITK_IMAGE_TYPE_double
529   template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
530 #  endif
531 #endif
532
533
534
535 #ifdef BBTK_ITK_IMAGE_DIM_4
536 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
537   template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
538 #  endif
539 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
540   template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
541 #  endif
542 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
543   template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
544 #  endif
545 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
546   template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
547 #  endif
548 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
549   template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
550 #  endif
551 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
552   template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
553 #  endif
554 #  ifdef BBTK_ITK_IMAGE_TYPE_float
555   template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
556 #  endif
557 #  ifdef BBTK_ITK_IMAGE_TYPE_double
558   template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
559 #  endif
560 #endif
561
562
563 } // namespace bbitk
564
565 namespace bbtk
566 {
567   BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
568 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
569 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
570
571  // Human readable names for itk images
572 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
573
574 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM)                                     \
575 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
576   { std::string n("itkImage");                                                      \
577         n+= HumanTypeName<TYPE>();                                                  \
578  n += std::string(#DIM);                                                            \
579 n += std::string("ptr");                                                            \
580         return n; }                                                                 \
581     template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &)        \
582     { std::string n("itkImage");\
583  n+= HumanTypeName<TYPE>(); \
584         n += std::string(#DIM); \
585 n+= std::string("ptr"); \
586         return n; }                                                     \
587 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >()            \
588   { std::string n("itkImage"); \
589         n+= HumanTypeName<TYPE>();\
590  n += std::string(#DIM);\
591 n += std::string("cptr"); \
592         return n; }                                                     \
593     template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &)      \
594     { std::string n("itkImage");\
595  n+= HumanTypeName<TYPE>(); \
596         n += std::string(#DIM); \
597 n+= std::string("cptr"); \
598         return n; }
599
600 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);                      
601
602 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
603
604         
605 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
606   BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM);    \
607     BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
608     BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
609     BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM);\
610     BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
611     BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM);\
612     BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM);   \
613     BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
614   
615   BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
616   BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
617   BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
618   //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)
619   
620
621 } // namespace bbtk
622
623 #endif
624 #endif