]> Creatis software - bbtk.git/blob - packages/itk/src/bbitkImage.h
f44317be61c87dbf9f906b146dbe9be6e3ecc8ac
[bbtk.git] / packages / itk / src / bbitkImage.h
1 /*=========================================================================                                                                               
2   Program:   bbtk
3   Module:    $RCSfile: bbitkImage.h,v $
4   Language:  C++
5   Date:      $Date: 2008/10/17 08:18:21 $
6   Version:   $Revision: 1.4 $
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   /// General macro which calls the template function FUN instanciated 
300   /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info). 
301 #define BBTK_TEMPLATE_ITK_IMAGE_DIM_3_SWITCH(TYPE_INFO,FUN,ERROR_MESSAGE)       \
302   BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO)                 \
303     BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,)      \
304     BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,)     \
305     BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,)     \
306     BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,)     \
307     BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,)    \
308     BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,)    \
309     BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,)       \
310     BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,)      \
311     BBTK_END_TEMPLATE_SWITCH_MESSAGE(TYPE_INFO,ERROR_MESSAGE)
312
313
314   /// General macro which calls the template function FUN instanciated 
315   /// on the right type of itk image depending on the value of TYPE_INFO (which must be of type type_info). 
316   
317 #define BBTK_TEMPLATE_CONST_ITK_IMAGE_SWITCH(TYPE_INFO,FUN)     \
318   BBTK_BEGIN_TEMPLATE_SWITCH(TYPE_INFO)                 \
319     BBTK_SWITCH_ITK_IMAGE_int8_t_2(TYPE_INFO,FUN,c)     \
320     BBTK_SWITCH_ITK_IMAGE_int16_t_2(TYPE_INFO,FUN,c)    \
321     BBTK_SWITCH_ITK_IMAGE_int32_t_2(TYPE_INFO,FUN,c)    \
322     BBTK_SWITCH_ITK_IMAGE_uint8_t_2(TYPE_INFO,FUN,c)    \
323     BBTK_SWITCH_ITK_IMAGE_uint16_t_2(TYPE_INFO,FUN,c)   \
324     BBTK_SWITCH_ITK_IMAGE_uint32_t_2(TYPE_INFO,FUN,c)   \
325     BBTK_SWITCH_ITK_IMAGE_float_2(TYPE_INFO,FUN,c)      \
326     BBTK_SWITCH_ITK_IMAGE_double_2(TYPE_INFO,FUN,c)     \
327     BBTK_SWITCH_ITK_IMAGE_int8_t_3(TYPE_INFO,FUN,c)     \
328     BBTK_SWITCH_ITK_IMAGE_int16_t_3(TYPE_INFO,FUN,c)    \
329     BBTK_SWITCH_ITK_IMAGE_int32_t_3(TYPE_INFO,FUN,c)    \
330     BBTK_SWITCH_ITK_IMAGE_uint8_t_3(TYPE_INFO,FUN,c)    \
331     BBTK_SWITCH_ITK_IMAGE_uint16_t_3(TYPE_INFO,FUN,c)   \
332     BBTK_SWITCH_ITK_IMAGE_uint32_t_3(TYPE_INFO,FUN,c)   \
333     BBTK_SWITCH_ITK_IMAGE_float_3(TYPE_INFO,FUN,c)      \
334     BBTK_SWITCH_ITK_IMAGE_double_3(TYPE_INFO,FUN,c)     \
335     BBTK_SWITCH_ITK_IMAGE_int8_t_4(TYPE_INFO,FUN,c)     \
336     BBTK_SWITCH_ITK_IMAGE_int16_t_4(TYPE_INFO,FUN,c)    \
337     BBTK_SWITCH_ITK_IMAGE_int32_t_4(TYPE_INFO,FUN,c)    \
338     BBTK_SWITCH_ITK_IMAGE_uint8_t_4(TYPE_INFO,FUN,c)    \
339     BBTK_SWITCH_ITK_IMAGE_uint16_t_4(TYPE_INFO,FUN,c)   \
340     BBTK_SWITCH_ITK_IMAGE_uint32_t_4(TYPE_INFO,FUN,c)   \
341     BBTK_SWITCH_ITK_IMAGE_float_4(TYPE_INFO,FUN,c)      \
342     BBTK_SWITCH_ITK_IMAGE_double_4(TYPE_INFO,FUN,c)     \
343     BBTK_END_TEMPLATE_SWITCH(TYPE_INFO)                        
344    
345 #define BBTK_GITIFPTI_DIM(DIM)                          \
346   if (pti == typeid(unsigned char))                     \
347     return typeid(itk::Image<unsigned char,DIM>*);      \
348     if (pti == typeid(unsigned short))                  \
349       return typeid(itk::Image<unsigned short,DIM>*);   \
350     if (pti == typeid(unsigned int))                    \
351       return typeid(itk::Image<unsigned int,DIM>*);     \
352     if (pti == typeid(unsigned long))                   \
353       return typeid(itk::Image<unsigned long,DIM>*);    \
354     if (pti == typeid(signed char))                     \
355       return typeid(itk::Image<signed char,DIM>*);      \
356     if (pti == typeid(signed short))                    \
357       return typeid(itk::Image<signed short,DIM>*);     \
358     if (pti == typeid(signed int))                      \
359       return typeid(itk::Image<signed int,DIM>*);       \
360     if (pti == typeid(signed long))                     \
361       return typeid(itk::Image<signed long,DIM>*);      \
362     if (pti == typeid(float))                           \
363       return typeid(itk::Image<float,DIM>*);            \
364     if (pti == typeid(double))                          \
365       return typeid(itk::Image<double,DIM>*);                           
366   
367
368   inline bbtk::TypeInfo GetITKImagePtrTypeInfoFromPixelTypeInfoAndDimension( 
369                                                                             bbtk::TypeInfo pti,
370                                                                             unsigned int dim )
371   {
372     if      (dim==2) { BBTK_GITIFPTI_DIM(2); }
373     else if (dim==3) { BBTK_GITIFPTI_DIM(3); }
374     else if (dim==4) { BBTK_GITIFPTI_DIM(4); }
375     else 
376       {
377                 //bbtkGlobalError("GetImageTypeInfoFromPixelTypeInfo : itk::Images not compiled for dim "<<dim);
378         return typeid(void);
379       }
380     return typeid(void);
381   }
382
383
384 #undef BBTK_GITIFPTI_DIM
385
386
387 ///
388 template <typename ValueType>
389 class TypeMapping
390 {
391 public:
392   TypeMapping() {}
393
394   template <typename T>
395   ValueType& value()
396   {
397     return m_map[ (void*)typeid(T).name() ];
398   }
399   template <typename T>
400   ValueType& operator[]( const T& )
401   {
402     return m_map[ (void*)typeid(T).name() ];
403   }
404
405   ValueType& operator[]( const std::type_info& t)
406   {
407     return m_map[ (void*)t.name() ];
408   }
409   
410   unsigned int size() const { return m_map.size(); }
411
412   typedef typename std::map<void*, ValueType>::const_iterator const_iterator;
413
414   const_iterator begin() const { return m_map.begin(); }
415   const_iterator end() const { return m_map.end(); }
416
417 protected:
418   std::map<void*, ValueType> m_map;
419 };
420   
421 #define BBTK_BUILD_ITK_IMAGE_FUNCTION_MAPPING(MAP,FUN)                  \
422   MAP.value<bbtk::Image_int8_t_2_ptr>() = FUN<bbtk::Image_int8_t_2_ptr>; \
423     MAP.value<bbtk::Image_int16_t_2_ptr>() = FUN<bbtk::Image_int16_t_2_ptr>; \
424     MAP.value<bbtk::Image_int32_t_2_ptr>() = FUN<bbtk::Image_int32_t_2_ptr>; \
425     MAP.value<bbtk::Image_uint8_t_2_ptr>() = FUN<bbtk::Image_uint8_t_2_ptr>; \
426     MAP.value<bbtk::Image_uint16_t_2_ptr>() = FUN<bbtk::Image_uint16_t_2_ptr>; \
427     MAP.value<bbtk::Image_uint32_t_2_ptr>() = FUN<bbtk::Image_uint32_t_2_ptr>; \
428     MAP.value<bbtk::Image_float_2_ptr>() = FUN<bbtk::Image_float_2_ptr>;        \
429     MAP.value<bbtk::Image_double_2_ptr>() = FUN<bbtk::Image_double_2_ptr>; \
430     MAP.value<bbtk::Image_int8_t_3_ptr>() = FUN<bbtk::Image_int8_t_3_ptr>; \
431     MAP.value<bbtk::Image_int16_t_3_ptr>() = FUN<bbtk::Image_int16_t_3_ptr>; \
432     MAP.value<bbtk::Image_int32_t_3_ptr>() = FUN<bbtk::Image_int32_t_3_ptr>; \
433     MAP.value<bbtk::Image_uint8_t_3_ptr>() = FUN<bbtk::Image_uint8_t_3_ptr>; \
434     MAP.value<bbtk::Image_uint16_t_3_ptr>() = FUN<bbtk::Image_uint16_t_3_ptr>; \
435     MAP.value<bbtk::Image_uint32_t_3_ptr>() = FUN<bbtk::Image_uint32_t_3_ptr>; \
436     MAP.value<bbtk::Image_float_3_ptr>() = FUN<bbtk::Image_float_3_ptr>;        \
437     MAP.value<bbtk::Image_double_3_ptr>() = FUN<bbtk::Image_double_3_ptr>; \
438     MAP.value<bbtk::Image_int8_t_4_ptr>() = FUN<bbtk::Image_int8_t_4_ptr>; \
439     MAP.value<bbtk::Image_int16_t_4_ptr>() = FUN<bbtk::Image_int16_t_4_ptr>; \
440     MAP.value<bbtk::Image_int32_t_4_ptr>() = FUN<bbtk::Image_int32_t_4_ptr>; \
441     MAP.value<bbtk::Image_uint8_t_4_ptr>() = FUN<bbtk::Image_uint8_t_4_ptr>; \
442     MAP.value<bbtk::Image_uint16_t_4_ptr>() = FUN<bbtk::Image_uint16_t_4_ptr>; \
443     MAP.value<bbtk::Image_uint32_t_4_ptr>() = FUN<bbtk::Image_uint32_t_4_ptr>; \
444     MAP.value<bbtk::Image_float_4_ptr>() = FUN<bbtk::Image_float_4_ptr>;        \
445     MAP.value<bbtk::Image_double_4_ptr>() = FUN<bbtk::Image_double_4_ptr>; 
446   
447   //=======================================================================
448
449
450   //=======================================================================
451   // Type traits ImagePointer to define bbtk::any<ImagePointer>
452   /// The TypeTraits for all itk::Image pointer types 
453   template <typename T> struct ImagePointer { static const bool value = false; };
454
455   typedef bbtk::any<ImagePointer> anyImagePointer;
456
457   // Specialisations for instantiated image types 
458   // DIMENSION 2
459 #ifdef BBTK_ITK_IMAGE_DIM_2
460 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
461   template <> struct ImagePointer<Image_int8_t_2_ptr> { static const bool value = true; };
462 #  endif
463 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
464   template <> struct ImagePointer<Image_int16_t_2_ptr> { static const bool value = true; };
465 #  endif
466 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
467   template <> struct ImagePointer<Image_int32_t_2_ptr> { static const bool value = true; };
468 #  endif
469 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
470   template <> struct ImagePointer<Image_uint8_t_2_ptr> { static const bool value = true; };
471 #  endif
472 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
473   template <> struct ImagePointer<Image_uint16_t_2_ptr> { static const bool value = true; };
474 #  endif
475 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
476   template <> struct ImagePointer<Image_uint32_t_2_ptr> { static const bool value = true; };
477 #  endif
478 #  ifdef BBTK_ITK_IMAGE_TYPE_float
479   template <> struct ImagePointer<Image_float_2_ptr> { static const bool value = true; };
480 #  endif
481 #  ifdef BBTK_ITK_IMAGE_TYPE_double
482   template <> struct ImagePointer<Image_double_2_ptr> { static const bool value = true; };
483 #  endif
484 #endif
485
486
487
488 #ifdef BBTK_ITK_IMAGE_DIM_3
489 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
490   template <> struct ImagePointer<Image_int8_t_3_ptr> { static const bool value = true; };
491 #  endif
492 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
493   template <> struct ImagePointer<Image_int16_t_3_ptr> { static const bool value = true; };
494 #  endif
495 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
496   template <> struct ImagePointer<Image_int32_t_3_ptr> { static const bool value = true; };
497 #  endif
498 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
499   template <> struct ImagePointer<Image_uint8_t_3_ptr> { static const bool value = true; };
500 #  endif
501 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
502   template <> struct ImagePointer<Image_uint16_t_3_ptr> { static const bool value = true; };
503 #  endif
504 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
505   template <> struct ImagePointer<Image_uint32_t_3_ptr> { static const bool value = true; };
506 #  endif
507 #  ifdef BBTK_ITK_IMAGE_TYPE_float
508   template <> struct ImagePointer<Image_float_3_ptr> { static const bool value = true; };
509 #  endif
510 #  ifdef BBTK_ITK_IMAGE_TYPE_double
511   template <> struct ImagePointer<Image_double_3_ptr> { static const bool value = true; };
512 #  endif
513 #endif
514
515
516
517 #ifdef BBTK_ITK_IMAGE_DIM_4
518 #  ifdef BBTK_ITK_IMAGE_TYPE_int8_t 
519   template <> struct ImagePointer<Image_int8_t_4_ptr> { static const bool value = true; };
520 #  endif
521 #  ifdef BBTK_ITK_IMAGE_TYPE_int16_t 
522   template <> struct ImagePointer<Image_int16_t_4_ptr> { static const bool value = true; };
523 #  endif
524 #  ifdef BBTK_ITK_IMAGE_TYPE_int32_t 
525   template <> struct ImagePointer<Image_int32_t_4_ptr> { static const bool value = true; };
526 #  endif
527 #  ifdef BBTK_ITK_IMAGE_TYPE_uint8_t 
528   template <> struct ImagePointer<Image_uint8_t_4_ptr> { static const bool value = true; };
529 #  endif
530 #  ifdef BBTK_ITK_IMAGE_TYPE_uint16_t 
531   template <> struct ImagePointer<Image_uint16_t_4_ptr> { static const bool value = true; };
532 #  endif
533 #  ifdef BBTK_ITK_IMAGE_TYPE_uint32_t 
534   template <> struct ImagePointer<Image_uint32_t_4_ptr> { static const bool value = true; };
535 #  endif
536 #  ifdef BBTK_ITK_IMAGE_TYPE_float
537   template <> struct ImagePointer<Image_float_4_ptr> { static const bool value = true; };
538 #  endif
539 #  ifdef BBTK_ITK_IMAGE_TYPE_double
540   template <> struct ImagePointer<Image_double_4_ptr> { static const bool value = true; };
541 #  endif
542 #endif
543
544
545 } // namespace bbitk
546
547 namespace bbtk
548 {
549   BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::anyImagePointer,"anyItkImagePointer");
550 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_2_ptr,"itkImageDouble3ptr");
551 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_double_3_ptr,"itkImageDouble3ptr");
552
553  // Human readable names for itk images
554 // #define BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) std::string("itkImage")+HumanTypeName<TYPE>()+std::string(#DIM)+std::string("ptr")
555
556 #define BBTK_HUMAN_READABLE_ITK_IMAGE(TYPE,DIM)  \
557 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >()             \
558   { std::string n("itkImage"); \
559         n+= HumanTypeName<TYPE>();\
560  n += std::string(#DIM);\
561 n += std::string("ptr"); \
562         return n; }                                                     \
563     template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_ptr >(const bbitk::Image_##TYPE##_##DIM##_ptr &)        \
564     { std::string n("itkImage");\
565  n+= HumanTypeName<TYPE>(); \
566         n += std::string(#DIM); \
567 n+= std::string("ptr"); \
568         return n; }                                                     \
569 template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >()            \
570   { std::string n("itkImage"); \
571         n+= HumanTypeName<TYPE>();\
572  n += std::string(#DIM);\
573 n += std::string("cptr"); \
574         return n; }                                                     \
575     template <> inline std::string HumanTypeName< bbitk::Image_##TYPE##_##DIM##_cptr >(const bbitk::Image_##TYPE##_##DIM##_cptr &)      \
576     { std::string n("itkImage");\
577  n+= HumanTypeName<TYPE>(); \
578         n += std::string(#DIM); \
579 n+= std::string("cptr"); \
580         return n; }
581
582 //BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,2);                      
583
584 //  BBTK_DEFINE_HUMAN_READABLE_TYPE_NAME(bbitk::Image_##TYPE##_##DIM##_ptr,BBTK_HUMAN_READABLE_ITK_IMAGE_NAME(TYPE,DIM) )
585
586         
587 #define BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(DIM) \
588   BBTK_HUMAN_READABLE_ITK_IMAGE(int8_t,DIM);            \
589     BBTK_HUMAN_READABLE_ITK_IMAGE(uint8_t,DIM); \
590     BBTK_HUMAN_READABLE_ITK_IMAGE(int16_t,DIM); \
591     BBTK_HUMAN_READABLE_ITK_IMAGE(uint16_t,DIM);        \
592     BBTK_HUMAN_READABLE_ITK_IMAGE(int32_t,DIM); \
593     BBTK_HUMAN_READABLE_ITK_IMAGE(uint32_t,DIM);        \
594     BBTK_HUMAN_READABLE_ITK_IMAGE(float,DIM);           \
595     BBTK_HUMAN_READABLE_ITK_IMAGE(double,DIM)
596   
597   BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(2);
598   BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(3);
599   BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(4);
600   //BBTK_HUMAN_READABLE_ITK_IMAGES_DIM(5)
601   
602
603 } // namespace bbtk
604
605 #endif
606 #endif