2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
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
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.
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
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 # ------------------------------------------------------------------------ */
28 /*=========================================================================
30 Module: $RCSfile: bbitkImage.h,v $
32 Date: $Date: 2012/11/16 08:50:39 $
33 Version: $Revision: 1.9 $
34 =========================================================================*/
41 #ifndef __BBITKIMAGE_H_INCLUDED__
42 #define __BBITKIMAGE_H_INCLUDED__
46 #include "bbtkSystem.h"
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;
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)
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)
75 // printf("EEDitk TYPE_INFO=%s %s\n", TYPE_INFO.name(), typeid(bbitk::Image_int8_t_3_##CONST##ptr).name() ); \
77 #define BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
78 if ( TYPE_INFO == typeid(bbitk::Image_uint16_t_3_ptr) ) { printf ("Yes\n"); }else{ printf ("No\n"); } \
79 if ( strcmp(TYPE_INFO.name() , typeid(bbitk::Image_uint16_t_3_ptr).name() ) ==0 ) { printf ("Yes\n"); }else{ printf ("No\n"); } \
80 printf("EEDitk TYPE_INFO=<%s> <%s> <%s>\n", TYPE_INFO.name(), bbtk::demangle_type_name(typeid(bbitk::Image_uint8_t_3_ptr).name()).c_str() , typeid(bbitk::Image_uint8_t_3_ptr).name() ); \
81 printf("EEDitk TYPE_INFO=<%s> <%s> <%s>\n", TYPE_INFO.name(), bbtk::demangle_type_name(typeid(bbitk::Image_uint16_t_3_ptr).name()).c_str() , typeid(bbitk::Image_uint16_t_3_ptr).name() ); \
82 printf("EEDitk TYPE_INFO=<%s> <%s> <%s>\n", TYPE_INFO.name(), bbtk::demangle_type_name(typeid(bbitk::Image_uint32_t_3_ptr).name()).c_str() , typeid(bbitk::Image_uint32_t_3_ptr).name() ); \
85 #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())<<">"); }
87 #define BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,MESSAGE) else { bbtkError(MESSAGE); }
89 /// Generic macro which calls a TEMPLATE_FUNCTION instanciated
90 /// on TEMPLATE_TYPE iff TYPE_INFO == typeid(TEST_TYPE).
91 /// This macro must be used (maybe several times) between a pair of BEGIN_TEMPLATE_SWITCH and END_TEMPLATE_SWITCH macros
95 // else if (TYPE_INFO == typeid(bbitk::TEST_TYPE)) \
97 #define TEMPLATE_SWITCH(TYPE_INFO,TEST_TYPE,TEMPLATE_FUNCTION,TEMPLATE_TYPE) \
98 else if ( strcmp(TYPE_INFO.name() , typeid(bbitk::TEST_TYPE).name() ) ==0 ) \
99 { TEMPLATE_FUNCTION<bbitk::TEMPLATE_TYPE>(); }
103 #ifdef BBTK_ITK_IMAGE_DIM_2
104 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
105 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST) \
106 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_2_##CONST##ptr,FUN,Image_int8_t_2)
108 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
110 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
111 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST) \
112 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_2_##CONST##ptr,FUN,Image_int16_t_2)
114 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
116 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
117 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST) \
118 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_2_##CONST##ptr,FUN,Image_int32_t_2)
120 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
122 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
123 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST) \
124 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_2_##CONST##ptr,FUN,Image_uint8_t_2)
126 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
128 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
129 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST) \
130 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_2_##CONST##ptr,FUN,Image_uint16_t_2)
132 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
134 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
135 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST) \
136 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_2_##CONST##ptr,FUN,Image_uint32_t_2)
138 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
140 # ifdef BBTK_ITK_IMAGE_TYPE_float
141 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST) \
142 TEMPLATE_SWITCH(TYPE_INFO,Image_float_2_##CONST##ptr,FUN,Image_float_2)
144 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
146 # ifdef BBTK_ITK_IMAGE_TYPE_double
147 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST) \
148 TEMPLATE_SWITCH(TYPE_INFO,Image_double_2_##CONST##ptr,FUN,Image_double_2)
150 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
153 # define BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,CONST)
154 # define BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,CONST)
155 # define BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,CONST)
156 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,CONST)
157 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,CONST)
158 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,CONST)
159 # define BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,CONST)
160 # define BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,CONST)
164 #ifdef BBTK_ITK_IMAGE_DIM_3
165 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
166 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST) \
167 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_3_##CONST##ptr,FUN,Image_int8_t_3)
169 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
171 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
172 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST) \
173 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_3_##CONST##ptr,FUN,Image_int16_t_3)
175 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
177 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
178 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST) \
179 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_3_##CONST##ptr,FUN,Image_int32_t_3)
181 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
183 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
184 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST) \
185 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_3_##CONST##ptr,FUN,Image_uint8_t_3)
187 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
189 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
190 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST) \
191 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_3_##CONST##ptr,FUN,Image_uint16_t_3)
193 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
195 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
196 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST) \
197 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_3_##CONST##ptr,FUN,Image_uint32_t_3)
199 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
201 # ifdef BBTK_ITK_IMAGE_TYPE_float
202 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST) \
203 TEMPLATE_SWITCH(TYPE_INFO,Image_float_3_##CONST##ptr,FUN,Image_float_3)
205 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
207 # ifdef BBTK_ITK_IMAGE_TYPE_double
208 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST) \
209 TEMPLATE_SWITCH(TYPE_INFO,Image_double_3_##CONST##ptr,FUN,Image_double_3)
211 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
214 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
215 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
216 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
217 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
218 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
219 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
220 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
221 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
227 #ifdef BBTK_ITK_IMAGE_DIM_3
228 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
229 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST) \
230 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_3_ptr,FUN,Image_int8_t_3)
232 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
234 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
235 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST) \
236 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_3_ptr,FUN,Image_int16_t_3)
238 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
240 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
241 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST) \
242 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_3_ptr,FUN,Image_int32_t_3)
244 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
246 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
247 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST) \
248 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_3_ptr,FUN,Image_uint8_t_3)
250 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
252 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
253 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST) \
254 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_3_,FUN,Image_uint16_t_3)
256 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
258 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
259 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST) \
260 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_3_ptr,FUN,Image_uint32_t_3)
262 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
264 # ifdef BBTK_ITK_IMAGE_TYPE_float
265 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST) \
266 TEMPLATE_SWITCH(TYPE_INFO,Image_float_3_ptr,FUN,Image_float_3)
268 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
270 # ifdef BBTK_ITK_IMAGE_TYPE_double
271 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST) \
272 TEMPLATE_SWITCH(TYPE_INFO,Image_double_3_ptr,FUN,Image_double_3)
274 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
277 # define BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,CONST)
278 # define BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,CONST)
279 # define BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,CONST)
280 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,CONST)
281 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,CONST)
282 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,CONST)
283 # define BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,CONST)
284 # define BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,CONST)
291 #ifdef BBTK_ITK_IMAGE_DIM_4
292 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
293 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST) \
294 TEMPLATE_SWITCH(TYPE_INFO,Image_int8_t_4_##CONST##ptr,FUN,Image_int8_t_4)
296 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
298 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
299 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST) \
300 TEMPLATE_SWITCH(TYPE_INFO,Image_int16_t_4_##CONST##ptr,FUN,Image_int16_t_4)
302 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
304 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
305 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST) \
306 TEMPLATE_SWITCH(TYPE_INFO,Image_int32_t_4_##CONST##ptr,FUN,Image_int32_t_4)
308 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
310 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
311 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST) \
312 TEMPLATE_SWITCH(TYPE_INFO,Image_uint8_t_4_##CONST##ptr,FUN,Image_uint8_t_4)
314 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
316 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
317 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST) \
318 TEMPLATE_SWITCH(TYPE_INFO,Image_uint16_t_4_##CONST##ptr,FUN,Image_uint16_t_4)
320 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
322 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
323 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST) \
324 TEMPLATE_SWITCH(TYPE_INFO,Image_uint32_t_4_##CONST##ptr,FUN,Image_uint32_t_4)
326 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
328 # ifdef BBTK_ITK_IMAGE_TYPE_float
329 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST) \
330 TEMPLATE_SWITCH(TYPE_INFO,Image_float_4_##CONST##ptr,FUN,Image_float_4)
332 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
334 # ifdef BBTK_ITK_IMAGE_TYPE_double
335 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST) \
336 TEMPLATE_SWITCH(TYPE_INFO,Image_double_4_##CONST##ptr,FUN,Image_double_4)
338 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
341 # define BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,CONST)
342 # define BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,CONST)
343 # define BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,CONST)
344 # define BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,CONST)
345 # define BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,CONST)
346 # define BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,CONST)
347 # define BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,CONST)
348 # define BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,CONST)
352 /// General macro which calls the template function FUN instanciated
353 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
354 #define BBTK_TEMPLATE_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
355 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
356 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,) \
357 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,) \
358 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,) \
359 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,) \
360 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,) \
361 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,) \
362 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,) \
363 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,) \
364 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
365 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
366 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
367 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
368 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
369 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
370 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
371 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
372 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,) \
373 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,) \
374 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,) \
375 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,) \
376 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,) \
377 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,) \
378 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,) \
379 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,) \
380 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
384 /// General macro which calls the template function FUN instanciated
385 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
386 #define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE) \
387 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
388 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,) \
389 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,) \
390 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,) \
391 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,) \
392 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,) \
393 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,) \
394 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,) \
395 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,) \
396 BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,ERROR_MESSAGE)
399 /// General macro which calls the template function FUN instanciated
400 /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info).
402 #define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN) \
403 BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO) \
404 BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c) \
405 BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c) \
406 BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,c) \
407 BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,c) \
408 BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,c) \
409 BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,c) \
410 BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,c) \
411 BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,c) \
412 BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,c) \
413 BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,c) \
414 BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,c) \
415 BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,c) \
416 BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,c) \
417 BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,c) \
418 BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,c) \
419 BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,c) \
420 BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,c) \
421 BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,c) \
422 BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,c) \
423 BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,c) \
424 BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,c) \
425 BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c) \
426 BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c) \
427 BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c) \
428 BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)
430 #define BBTK_GITIFPTI_DIM(DIM) \
431 if (pti == typeid(unsigned char)) \
432 return typeid(itk::Image<unsigned char,DIM>*); \
433 if (pti == typeid(unsigned short)) \
434 return typeid(itk::Image<unsigned short,DIM>*); \
435 if (pti == typeid(unsigned int)) \
436 return typeid(itk::Image<unsigned int,DIM>*); \
437 if (pti == typeid(unsigned long)) \
438 return typeid(itk::Image<unsigned long,DIM>*); \
439 if (pti == typeid(signed char)) \
440 return typeid(itk::Image<signed char,DIM>*); \
441 if (pti == typeid(signed short)) \
442 return typeid(itk::Image<signed short,DIM>*); \
443 if (pti == typeid(signed int)) \
444 return typeid(itk::Image<signed int,DIM>*); \
445 if (pti == typeid(signed long)) \
446 return typeid(itk::Image<signed long,DIM>*); \
447 if (pti == typeid(float)) \
448 return typeid(itk::Image<float,DIM>*); \
449 if (pti == typeid(double)) \
450 return typeid(itk::Image<double,DIM>*);
453 inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension(
457 if (dim==2) { BBTK_GITIFPTI_DIM(2); }
458 else if (dim==3) { BBTK_GITIFPTI_DIM(3); }
459 else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
462 //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
469 #undef BBTK_GITIFPTI_DIM
473 template <typename ValueType>
479 template <typename T>
482 return m_map[ (void*)typeid(T).name() ];
484 template <typename T>
485 ValueType& operator[]( const T& )
487 return m_map[ (void*)typeid(T).name() ];
490 ValueType& operator[]( const std::type_info& t)
492 return m_map[ (void*)t.name() ];
495 unsigned int size() const { return m_map.size(); }
497 typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
499 const_iterator begin() const { return m_map.begin(); }
500 const_iterator end() const { return m_map.end(); }
503 std::map<void*, ValueType> m_map;
506 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN) \
507 MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
508 MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
509 MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
510 MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
511 MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
512 MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
513 MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>; \
514 MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
515 MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
516 MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
517 MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
518 MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
519 MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
520 MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
521 MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>; \
522 MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
523 MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
524 MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
525 MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
526 MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
527 MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
528 MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
529 MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>; \
530 MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>;
532 //=======================================================================
535 //=======================================================================
536 // Type traits ImagePointer to define bbtk::any<ImagePointer>
537 /// The TypeTraits for all itk::Image pointer types
538 template <typename T> struct ImagePointer { static const bool value = false; };
540 typedef bbtk::any<ImagePointer> anyImagePointer;
542 // Specialisations for instantiated image types
544 #ifdef BBTK_ITK_IMAGE_DIM_2
545 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
546 template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
548 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
549 template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
551 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
552 template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
554 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
555 template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
557 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
558 template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
560 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
561 template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
563 # ifdef BBTK_ITK_IMAGE_TYPE_float
564 template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
566 # ifdef BBTK_ITK_IMAGE_TYPE_double
567 template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
573 #ifdef BBTK_ITK_IMAGE_DIM_3
574 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
575 template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
577 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
578 template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
580 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
581 template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
583 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
584 template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
586 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
587 template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
589 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
590 template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
592 # ifdef BBTK_ITK_IMAGE_TYPE_float
593 template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
595 # ifdef BBTK_ITK_IMAGE_TYPE_double
596 template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
602 #ifdef BBTK_ITK_IMAGE_DIM_4
603 # ifdef BBTK_ITK_IMAGE_TYPE_int8_t
604 template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
606 # ifdef BBTK_ITK_IMAGE_TYPE_int16_t
607 template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
609 # ifdef BBTK_ITK_IMAGE_TYPE_int32_t
610 template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
612 # ifdef BBTK_ITK_IMAGE_TYPE_uint8_t
613 template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
615 # ifdef BBTK_ITK_IMAGE_TYPE_uint16_t
616 template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
618 # ifdef BBTK_ITK_IMAGE_TYPE_uint32_t
619 template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
621 # ifdef BBTK_ITK_IMAGE_TYPE_float
622 template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
624 # ifdef BBTK_ITK_IMAGE_TYPE_double
625 template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
634 BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
635 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
636 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
638 // Human readable names for itk images
639 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
641 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM) \
642 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >() \
643 { std::string n("itkImage"); \
644 n+= HumanTypeName<TYPE>(); \
645 n += std::string(#DIM); \
646 n += std::string("ptr"); \
648 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &) \
649 { std::string n("itkImage");\
650 n+= HumanTypeName<TYPE>(); \
651 n += std::string(#DIM); \
652 n+= std::string("ptr"); \
654 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >() \
655 { std::string n("itkImage"); \
656 n+= HumanTypeName<TYPE>();\
657 n += std::string(#DIM);\
658 n += std::string("cptr"); \
660 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &) \
661 { std::string n("itkImage");\
662 n+= HumanTypeName<TYPE>(); \
663 n += std::string(#DIM); \
664 n+= std::string("cptr"); \
667 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);
669 // BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
672 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
673 BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM); \
674 BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
675 BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
676 BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM);\
677 BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
678 BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM);\
679 BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM); \
680 BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
682 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
683 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
684 BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
685 //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)