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