BEM++  2.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
explicit_instantiation.hpp
1 // Copyright (C) 2011-2012 by the BEM++ Authors
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20 
21 #ifndef fiber_explicit_instantiation_hpp
22 #define fiber_explicit_instantiation_hpp
23 
24 #include "../common/common.hpp"
25 
26 #include "bempp/common/config_data_types.hpp"
27 #include <complex>
28 
29 // Invoke an arbitrary macro for all valid basis types
30 #if defined(ENABLE_SINGLE_PRECISION)
31 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_SP_REAL(MACRO) \
32  MACRO( float )
33 #else
34 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_SP_REAL(MACRO)
35 #endif
36 
37 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
38 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_SP_COMPLEX(MACRO) \
39  MACRO( std::complex<float> )
40 #else
41 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_SP_COMPLEX(MACRO)
42 #endif
43 
44 #if defined(ENABLE_DOUBLE_PRECISION)
45 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_DP_REAL(MACRO) \
46  MACRO( double )
47 #else
48 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_DP_REAL(MACRO)
49 #endif
50 
51 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
52 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_DP_COMPLEX(MACRO) \
53  MACRO( std::complex<double> )
54 #else
55 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_DP_COMPLEX(MACRO)
56 #endif
57 
58 #define FIBER_ITERATE_OVER_BASIS_TYPES(MACRO) \
59  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_SP_REAL(MACRO); \
60  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_SP_COMPLEX(MACRO); \
61  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_DP_REAL(MACRO); \
62  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_DP_COMPLEX(MACRO)
63 
64 // Invoke an arbitrary macro for all valid basis types
65 #if defined(ENABLE_SINGLE_PRECISION)
66 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_SP_REAL(MACRO) \
67  MACRO( float )
68 #else
69 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_SP_REAL(MACRO)
70 #endif
71 
72 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
73 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_SP_COMPLEX(MACRO) \
74  MACRO( std::complex<float> )
75 #else
76 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_SP_COMPLEX(MACRO)
77 #endif
78 
79 #if defined(ENABLE_DOUBLE_PRECISION)
80 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_DP_REAL(MACRO) \
81  MACRO( double )
82 #else
83 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_DP_REAL(MACRO)
84 #endif
85 
86 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
87 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_DP_COMPLEX(MACRO) \
88  MACRO( std::complex<double> )
89 #else
90 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_DP_COMPLEX(MACRO)
91 #endif
92 
93 #define FIBER_ITERATE_OVER_KERNEL_TYPES(MACRO) \
94  FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_SP_REAL(MACRO); \
95  FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_SP_COMPLEX(MACRO); \
96  FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_DP_REAL(MACRO); \
97  FIBER_INVOKE_MACRO_DEPENDENT_ON_KERNEL_DP_COMPLEX(MACRO)
98 
99 // Invoke arbitrary macro for all valid ValueTypes
100 
101 #if defined(ENABLE_SINGLE_PRECISION)
102 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_SP_REAL(MACRO) \
103  MACRO( float )
104 #else
105 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_SP_REAL(MACRO)
106 #endif
107 
108 #if defined(ENABLE_SINGLE_PRECISION) && \
109  (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
110 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_SP_COMPLEX(MACRO) \
111  MACRO( std::complex<float> )
112 #else
113 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_SP_COMPLEX(MACRO)
114 #endif
115 
116 #if defined(ENABLE_DOUBLE_PRECISION)
117 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_DP_REAL(MACRO) \
118  MACRO( double )
119 #else
120 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_DP_REAL(MACRO)
121 #endif
122 
123 #if defined(ENABLE_DOUBLE_PRECISION) && \
124  (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
125 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_DP_COMPLEX(MACRO) \
126  MACRO( std::complex<double> )
127 #else
128 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_DP_COMPLEX(CLASSNAME)
129 #endif
130 
131 #define FIBER_ITERATE_OVER_VALUE_TYPES(MACRO) \
132  FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_SP_REAL(MACRO); \
133  FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_SP_COMPLEX(MACRO); \
134  FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_DP_REAL(MACRO); \
135  FIBER_INVOKE_MACRO_DEPENDENT_ON_VALUE_DP_COMPLEX(MACRO)
136 
137 // Instantiation of classes templated on basis type
138 
139 #if defined(ENABLE_SINGLE_PRECISION)
140 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_SP_REAL(CLASSNAME) \
141  template class CLASSNAME<float>
142 #else
143 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_SP_REAL(CLASSNAME)
144 #endif
145 
146 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
147 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_SP_COMPLEX(CLASSNAME) \
148  template class CLASSNAME<std::complex<float> >
149 #else
150 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_SP_COMPLEX(CLASSNAME)
151 #endif
152 
153 #if defined(ENABLE_DOUBLE_PRECISION)
154 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_DP_REAL(CLASSNAME) \
155  template class CLASSNAME<double>
156 #else
157 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_DP_REAL(CLASSNAME)
158 #endif
159 
160 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
161 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_DP_COMPLEX(CLASSNAME) \
162  template class CLASSNAME<std::complex<double> >
163 #else
164 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_DP_COMPLEX(CLASSNAME)
165 #endif
166 
167 #define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS(CLASSNAME) \
168  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_SP_REAL(CLASSNAME); \
169  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_SP_COMPLEX(CLASSNAME); \
170  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_DP_REAL(CLASSNAME); \
171  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_DP_COMPLEX(CLASSNAME)
172 
173 // Instantiation of classes templated on kernel type
174 
175 #if defined(ENABLE_SINGLE_PRECISION)
176 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_SP_REAL(CLASSNAME) \
177  template class CLASSNAME<float>
178 #else
179 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_SP_REAL(CLASSNAME)
180 #endif
181 
182 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
183 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_SP_COMPLEX(CLASSNAME) \
184  template class CLASSNAME<std::complex<float> >
185 #else
186 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_SP_COMPLEX(CLASSNAME)
187 #endif
188 
189 #if defined(ENABLE_DOUBLE_PRECISION)
190 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_DP_REAL(CLASSNAME) \
191  template class CLASSNAME<double>
192 #else
193 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_DP_REAL(CLASSNAME)
194 #endif
195 
196 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
197 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_DP_COMPLEX(CLASSNAME) \
198  template class CLASSNAME<std::complex<double> >
199 #else
200 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_DP_COMPLEX(CLASSNAME)
201 #endif
202 
203 #define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL(CLASSNAME) \
204  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_SP_REAL(CLASSNAME); \
205  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_SP_COMPLEX(CLASSNAME); \
206  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_DP_REAL(CLASSNAME); \
207  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_KERNEL_DP_COMPLEX(CLASSNAME)
208 
209 // Instantiation of classes templated on result type
210 
211 #if defined(ENABLE_SINGLE_PRECISION)
212 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_SP_REAL(CLASSNAME) \
213  template class CLASSNAME<float>
214 #else
215 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_SP_REAL(CLASSNAME)
216 #endif
217 
218 #if defined(ENABLE_SINGLE_PRECISION) && \
219  (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
220 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_SP_COMPLEX(CLASSNAME) \
221  template class CLASSNAME<std::complex<float> >
222 #else
223 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_SP_COMPLEX(CLASSNAME)
224 #endif
225 
226 #if defined(ENABLE_DOUBLE_PRECISION)
227 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_DP_REAL(CLASSNAME) \
228  template class CLASSNAME<double>
229 #else
230 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_DP_REAL(CLASSNAME)
231 #endif
232 
233 #if defined(ENABLE_DOUBLE_PRECISION) && \
234  (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
235 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_DP_COMPLEX(CLASSNAME) \
236  template class CLASSNAME<std::complex<double> >
237 #else
238 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_DP_COMPLEX(CLASSNAME)
239 #endif
240 
241 #define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT(CLASSNAME) \
242  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_SP_REAL(CLASSNAME); \
243  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_SP_COMPLEX(CLASSNAME); \
244  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_DP_REAL(CLASSNAME); \
245  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_DP_COMPLEX(CLASSNAME)
246 
247 #define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_REAL_ONLY(CLASSNAME) \
248  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_SP_REAL(CLASSNAME); \
249  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_RESULT_DP_REAL(CLASSNAME)
250 
251 // Invoke an arbitrary macro for all valid (basis, result) type combinations
252 #if defined(ENABLE_SINGLE_PRECISION)
253 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_REAL_REAL(MACRO) \
254  MACRO(float, float)
255 #else
256 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_REAL_REAL(MACRO)
257 #endif
258 
259 #if defined(ENABLE_SINGLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
260 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_REAL_COMPLEX(MACRO) \
261  MACRO(float, std::complex<float>);
262 #else
263 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_REAL_COMPLEX(MACRO)
264 #endif
265 
266 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
267 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_COMPLEX_COMPLEX(MACRO) \
268  MACRO(std::complex<float>, std::complex<float> )
269 #else
270 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_COMPLEX_COMPLEX(MACRO)
271 #endif
272 
273 #if defined(ENABLE_DOUBLE_PRECISION)
274 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_REAL_REAL(MACRO) \
275  MACRO(double, double)
276 #else
277 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_REAL_REAL(MACRO)
278 #endif
279 
280 #if defined(ENABLE_DOUBLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
281 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_REAL_COMPLEX(MACRO) \
282  MACRO(double, std::complex<double> );
283 #else
284 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_REAL_COMPLEX(MACRO)
285 #endif
286 
287 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
288 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_COMPLEX_COMPLEX(MACRO) \
289  MACRO(std::complex<double>, std::complex<double> )
290 #else
291 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_COMPLEX_COMPLEX(MACRO)
292 #endif
293 
294 #define FIBER_ITERATE_OVER_BASIS_AND_RESULT_TYPES(MACRO) \
295  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_REAL_REAL(MACRO); \
296  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_REAL_COMPLEX(MACRO); \
297  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_SP_COMPLEX_COMPLEX(MACRO); \
298  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_REAL_REAL(MACRO); \
299  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_REAL_COMPLEX(MACRO); \
300  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_AND_RESULT_DP_COMPLEX_COMPLEX(MACRO);
301 
302 // Instantiation of classes templated on basis type and result type
303 
304 #if defined(ENABLE_SINGLE_PRECISION)
305 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_REAL_REAL(CLASSNAME) \
306  template class CLASSNAME<float, float>
307 #else
308 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_REAL_REAL(CLASSNAME)
309 #endif
310 
311 #if defined(ENABLE_SINGLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
312 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_REAL_COMPLEX(CLASSNAME) \
313  template class CLASSNAME<float, std::complex<float> >
314 #else
315 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_REAL_COMPLEX(CLASSNAME)
316 #endif
317 
318 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
319 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_COMPLEX_COMPLEX(CLASSNAME) \
320  template class CLASSNAME<std::complex<float>, std::complex<float> >
321 #else
322 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_COMPLEX_COMPLEX(CLASSNAME)
323 #endif
324 
325 #if defined(ENABLE_DOUBLE_PRECISION)
326 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_REAL_REAL(CLASSNAME) \
327  template class CLASSNAME<double, double>
328 #else
329 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_REAL_REAL(CLASSNAME)
330 #endif
331 
332 #if defined(ENABLE_DOUBLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
333 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_REAL_COMPLEX(CLASSNAME) \
334  template class CLASSNAME<double, std::complex<double> >
335 #else
336 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_REAL_COMPLEX(CLASSNAME)
337 #endif
338 
339 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
340 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_COMPLEX_COMPLEX(CLASSNAME) \
341  template class CLASSNAME<std::complex<double>, std::complex<double> >
342 #else
343 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_COMPLEX_COMPLEX(CLASSNAME)
344 #endif
345 
346 #define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT(CLASSNAME) \
347  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_REAL_REAL(CLASSNAME); \
348  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_REAL_COMPLEX(CLASSNAME); \
349  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_COMPLEX_COMPLEX(CLASSNAME); \
350  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_REAL_REAL(CLASSNAME); \
351  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_REAL_COMPLEX(CLASSNAME); \
352  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_COMPLEX_COMPLEX(CLASSNAME)
353 
354 #define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_REAL_ONLY(CLASSNAME) \
355  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_SP_REAL_REAL(CLASSNAME); \
356  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_AND_RESULT_DP_REAL_REAL(CLASSNAME)
357 
358 // Invoke an arbitrary macro for all valid (basis, kernel, result) type combinations
359 #if defined(ENABLE_SINGLE_PRECISION)
360 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_REAL(MACRO) \
361  MACRO(float, float, float)
362 #else
363 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_REAL(MACRO)
364 #endif
365 
366 #if defined(ENABLE_SINGLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
367 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_COMPLEX(MACRO) \
368  MACRO(float, float, std::complex<float> );
369 #else
370 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_COMPLEX(MACRO)
371 #endif
372 
373 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
374 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_COMPLEX_COMPLEX(MACRO) \
375  MACRO(float, std::complex<float>, std::complex<float> )
376 #else
377 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_COMPLEX_COMPLEX(MACRO)
378 #endif
379 
380 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
381 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_REAL_COMPLEX(MACRO) \
382  MACRO(std::complex<float>, float, std::complex<float> )
383 #else
384 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_REAL_COMPLEX(MACRO)
385 #endif
386 
387 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
388 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_COMPLEX_COMPLEX(MACRO) \
389  MACRO(std::complex<float>, std::complex<float>, std::complex<float> )
390 #else
391 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_COMPLEX_COMPLEX(MACRO)
392 #endif
393 
394 #if defined(ENABLE_DOUBLE_PRECISION)
395 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_REAL(MACRO) \
396  MACRO(double, double, double)
397 #else
398 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_REAL(MACRO)
399 #endif
400 
401 #if defined(ENABLE_DOUBLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
402 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_COMPLEX(MACRO) \
403  MACRO(double, double, std::complex<double> );
404 #else
405 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_COMPLEX(MACRO)
406 #endif
407 
408 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
409 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_COMPLEX_COMPLEX(MACRO) \
410  MACRO(double, std::complex<double>, std::complex<double> )
411 #else
412 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_COMPLEX_COMPLEX(MACRO)
413 #endif
414 
415 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
416 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_REAL_COMPLEX(MACRO) \
417  MACRO(std::complex<double>, double, std::complex<double> )
418 #else
419 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_REAL_COMPLEX(MACRO)
420 #endif
421 
422 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
423 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_COMPLEX_COMPLEX(MACRO) \
424  MACRO(std::complex<double>, std::complex<double>, std::complex<double> )
425 #else
426 # define FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_COMPLEX_COMPLEX(MACRO)
427 #endif
428 
429 #define FIBER_ITERATE_OVER_BASIS_KERNEL_AND_RESULT_TYPES(MACRO) \
430  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_REAL(MACRO); \
431  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_COMPLEX(MACRO); \
432  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_COMPLEX_COMPLEX(MACRO); \
433  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_REAL_COMPLEX(MACRO); \
434  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_COMPLEX_COMPLEX(MACRO); \
435  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_REAL(MACRO); \
436  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_COMPLEX(MACRO); \
437  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_COMPLEX_COMPLEX(MACRO); \
438  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_REAL_COMPLEX(MACRO); \
439  FIBER_INVOKE_MACRO_DEPENDENT_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_COMPLEX_COMPLEX(MACRO)
440 
441 // Instantiation of classes templated on basis type, kernel type and result type
442 
443 #if defined(ENABLE_SINGLE_PRECISION)
444 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_REAL(CLASSNAME) \
445  template class CLASSNAME<float, float, float>
446 #else
447 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_REAL(CLASSNAME)
448 #endif
449 
450 #if defined(ENABLE_SINGLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
451 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_COMPLEX(CLASSNAME) \
452  template class CLASSNAME<float, float, std::complex<float> >;
453 #else
454 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_COMPLEX(CLASSNAME)
455 #endif
456 
457 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
458 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_COMPLEX_COMPLEX(CLASSNAME) \
459  template class CLASSNAME<float, std::complex<float>, std::complex<float> >
460 #else
461 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_COMPLEX_COMPLEX(CLASSNAME)
462 #endif
463 
464 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
465 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_REAL_COMPLEX(CLASSNAME) \
466  template class CLASSNAME<std::complex<float>, float, std::complex<float> >
467 #else
468 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_REAL_COMPLEX(CLASSNAME)
469 #endif
470 
471 #if defined(ENABLE_SINGLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
472 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_COMPLEX_COMPLEX(CLASSNAME) \
473  template class CLASSNAME<std::complex<float>, std::complex<float>, std::complex<float> >
474 #else
475 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_COMPLEX_COMPLEX(CLASSNAME)
476 #endif
477 
478 #if defined(ENABLE_DOUBLE_PRECISION)
479 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_REAL(CLASSNAME) \
480  template class CLASSNAME<double, double, double>
481 #else
482 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_REAL(CLASSNAME)
483 #endif
484 
485 #if defined(ENABLE_DOUBLE_PRECISION) && (defined(ENABLE_COMPLEX_KERNELS) || defined(ENABLE_COMPLEX_BASIS_FUNCTIONS))
486 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_COMPLEX(CLASSNAME) \
487  template class CLASSNAME<double, double, std::complex<double> >;
488 #else
489 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_COMPLEX(CLASSNAME)
490 #endif
491 
492 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS)
493 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_COMPLEX_COMPLEX(CLASSNAME) \
494  template class CLASSNAME<double, std::complex<double>, std::complex<double> >
495 #else
496 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_COMPLEX_COMPLEX(CLASSNAME)
497 #endif
498 
499 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
500 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_REAL_COMPLEX(CLASSNAME) \
501  template class CLASSNAME<std::complex<double>, double, std::complex<double> >
502 #else
503 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_REAL_COMPLEX(CLASSNAME)
504 #endif
505 
506 #if defined(ENABLE_DOUBLE_PRECISION) && defined(ENABLE_COMPLEX_KERNELS) && defined(ENABLE_COMPLEX_BASIS_FUNCTIONS)
507 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_COMPLEX_COMPLEX(CLASSNAME) \
508  template class CLASSNAME<std::complex<double>, std::complex<double>, std::complex<double> >
509 #else
510 # define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_COMPLEX_COMPLEX(CLASSNAME)
511 #endif
512 
513 #define FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT(CLASSNAME) \
514  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_REAL(CLASSNAME); \
515  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_REAL_COMPLEX(CLASSNAME); \
516  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_REAL_COMPLEX_COMPLEX(CLASSNAME); \
517  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_REAL_COMPLEX(CLASSNAME); \
518  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_SP_COMPLEX_COMPLEX_COMPLEX(CLASSNAME); \
519  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_REAL(CLASSNAME); \
520  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_REAL_COMPLEX(CLASSNAME); \
521  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_REAL_COMPLEX_COMPLEX(CLASSNAME); \
522  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_REAL_COMPLEX(CLASSNAME); \
523  FIBER_INSTANTIATE_CLASS_TEMPLATED_ON_BASIS_KERNEL_AND_RESULT_DP_COMPLEX_COMPLEX_COMPLEX(CLASSNAME)
524 
525 #endif // fiber_explicit_instantiation_hpp