• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
97