]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | [auto_generated] | |
3 | boost/numeric/odeint/util/n_ary_helper.hpp | |
4 | ||
5 | Macros to generate scale_sumN and for_eachN functors. | |
6 | ||
7 | Copyright 2013 Karsten Ahnert | |
8 | Copyright 2013 Mario Mulansky | |
9 | Copyright 2013 Pascal Germroth | |
10 | ||
11 | Distributed under the Boost Software License, Version 1.0. | |
12 | (See accompanying file LICENSE_1_0.txt or | |
13 | copy at http://www.boost.org/LICENSE_1_0.txt) | |
14 | */ | |
15 | ||
16 | #ifndef BOOST_NUMERIC_ODEINT_UTIL_N_ARY_HELPER_HPP_INCLUDED | |
17 | #define BOOST_NUMERIC_ODEINT_UTIL_N_ARY_HELPER_HPP_INCLUDED | |
18 | ||
19 | #include <boost/preprocessor/repetition.hpp> | |
20 | ||
21 | // like BOOST_PP_ENUM_SHIFTED but with a comma in front like _TRAILING | |
22 | #define BOOST_ODEINT_ENUM_TRAILING_SHIFTED_PARAMS(count, param) \ | |
23 | BOOST_PP_COMMA_IF(BOOST_PP_DEC(count)) \ | |
24 | BOOST_PP_ENUM_SHIFTED_PARAMS(count, param) | |
25 | ||
26 | #define BOOST_ODEINT_ENUM_TRAILING_SHIFTED_BINARY_PARAMS(count, p1, p2) \ | |
27 | BOOST_PP_COMMA_IF(BOOST_PP_DEC(count)) \ | |
28 | BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(count, p1, p2) | |
29 | ||
30 | // like BOOST_PP_ENUM_SHIFTED_BINARY_PARAMS(n, p1, p2) but p2 is shifted left. | |
31 | // generate "p1 ## 0 = p2, p1 ## 1 = p3 ## 0, p1 ## 2 = p3 ## 1" | |
32 | #define BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS(count, p1, p2, p3) \ | |
33 | BOOST_PP_ENUM(count, BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS_, (p1, p2, p3)) | |
34 | #define BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS_(z, n, data) \ | |
35 | BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 0, data), n) \ | |
36 | BOOST_PP_IF(n, \ | |
37 | BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(3, 2, data), BOOST_PP_DEC(n)), \ | |
38 | BOOST_PP_TUPLE_ELEM(3, 1, data)) | |
39 | ||
40 | // like BOOST_PP_ENUM_BINARY_PARAMS(n, p1, p2) but with statements. | |
41 | // "p1 ## 0 p2 ## 0 ; p1 ## 1 p2 ## 1 ; ..." | |
42 | #define BOOST_ODEINT_ENUM_BINARY_STATEMENTS(count, p1, p2) \ | |
43 | BOOST_PP_REPEAT(count, BOOST_ODEINT_ENUM_BINARY_STATEMENTS_, (p1, p2)) | |
44 | #define BOOST_ODEINT_ENUM_BINARY_STATEMENTS_(z, n, data) \ | |
45 | BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, data), n) \ | |
46 | BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 1, data), n) ; | |
47 | ||
48 | // like BOOST_PP_ENUM_BINARY_PARAMS(n, p1, p2) but p2 is in parens. | |
49 | // "p1 ## 0 (p2 ## 0) , p1 ## 1 (p2 ## 1) , ..." | |
50 | #define BOOST_ODEINT_ENUM_UNARY_CALLS(count, p1, p2) \ | |
51 | BOOST_PP_ENUM(count, BOOST_ODEINT_ENUM_UNARY_CALLS_, (p1, p2)) | |
52 | #define BOOST_ODEINT_ENUM_SHIFTED_UNARY_CALLS(count, p1, p2) \ | |
53 | BOOST_PP_ENUM_SHIFTED(count, BOOST_ODEINT_ENUM_UNARY_CALLS_, (p1, p2)) | |
54 | #define BOOST_ODEINT_ENUM_TRAILING_SHIFTED_UNARY_CALLS(count, p1, p2) \ | |
55 | BOOST_PP_COMMA_IF(BOOST_PP_DEC(count)) \ | |
56 | BOOST_PP_ENUM_SHIFTED(count, BOOST_ODEINT_ENUM_UNARY_CALLS_, (p1, p2)) | |
57 | #define BOOST_ODEINT_ENUM_UNARY_CALLS_(z, n, data) \ | |
58 | BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, data), n) \ | |
59 | ( BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 1, data), n) ) | |
60 | ||
61 | ||
62 | // maximum arity + 1 for scale_sum and for_each | |
63 | #define BOOST_ODEINT_N_ARY_MAX 16 | |
64 | ||
65 | ||
66 | // generate scale_sum1 to scale_sumN, operator body generated by macro(N) | |
67 | #define BOOST_ODEINT_GEN_SCALE_SUM(macro) \ | |
68 | BOOST_PP_REPEAT_FROM_TO(1, BOOST_ODEINT_N_ARY_MAX, BOOST_ODEINT_GEN_SCALE_SUM_, macro) | |
69 | #define BOOST_ODEINT_GEN_SCALE_SUM_(z, n, macro) \ | |
70 | template< BOOST_ODEINT_ENUM_LSHIFTED_BINARY_PARAMS(n, class Fac, = double, = Fac) > \ | |
71 | struct BOOST_PP_CAT(scale_sum, n) \ | |
72 | { \ | |
73 | BOOST_ODEINT_ENUM_BINARY_STATEMENTS(n, const Fac, m_alpha) \ | |
74 | \ | |
75 | BOOST_PP_CAT(scale_sum, n) \ | |
76 | ( BOOST_PP_ENUM_BINARY_PARAMS(n, Fac, alpha) ) \ | |
77 | : BOOST_ODEINT_ENUM_UNARY_CALLS(n, m_alpha, alpha) {} \ | |
78 | \ | |
79 | template< BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), class T) > \ | |
80 | void operator()( T0 &t0 \ | |
81 | BOOST_ODEINT_ENUM_TRAILING_SHIFTED_BINARY_PARAMS(BOOST_PP_INC(n), const T, &t) \ | |
82 | ) const \ | |
83 | { macro(n) } \ | |
84 | typedef void result_type; \ | |
85 | }; | |
86 | ||
87 | // generate for_each1 to for_eachN, body generated by macro(N) | |
88 | #define BOOST_ODEINT_GEN_FOR_EACH(macro) \ | |
89 | BOOST_PP_REPEAT_FROM_TO(1, BOOST_ODEINT_N_ARY_MAX, BOOST_ODEINT_GEN_FOR_EACH_, macro) | |
90 | #define BOOST_ODEINT_GEN_FOR_EACH_(z, n, macro) \ | |
91 | template< BOOST_PP_ENUM_PARAMS(n, class S) , class Op > \ | |
92 | static void for_each##n ( BOOST_PP_ENUM_BINARY_PARAMS(n, S, &s) , Op op ) \ | |
93 | { macro(n) } | |
94 | ||
95 | ||
96 | #endif |