annotate DEPENDENCIES/generic/include/boost/numeric/odeint/util/n_ary_helper.hpp @ 125:34e428693f5d vext

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