annotate DEPENDENCIES/generic/include/boost/accumulators/numeric/detail/function_n.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 // Copyright David Abrahams 2006. Distributed under the Boost
Chris@16 2 // Software License, Version 1.0. (See accompanying
Chris@16 3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 4 //
Chris@16 5 // #include guards intentionally disabled.
Chris@16 6 // #ifndef BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP
Chris@16 7 // # define BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP
Chris@16 8
Chris@16 9 #include <boost/mpl/void.hpp>
Chris@16 10 #include <boost/mpl/apply.hpp>
Chris@16 11
Chris@16 12 #include <boost/preprocessor/control/if.hpp>
Chris@16 13 #include <boost/preprocessor/cat.hpp>
Chris@16 14 #include <boost/preprocessor/punctuation/comma_if.hpp>
Chris@16 15 #include <boost/preprocessor/repetition/enum_params.hpp>
Chris@16 16 #include <boost/preprocessor/repetition/enum_trailing_params.hpp>
Chris@16 17 #include <boost/preprocessor/repetition/repeat.hpp>
Chris@16 18 #include <boost/preprocessor/seq/fold_left.hpp>
Chris@16 19 #include <boost/preprocessor/seq/seq.hpp>
Chris@16 20 #include <boost/preprocessor/seq/for_each.hpp>
Chris@16 21 #include <boost/preprocessor/seq/for_each_i.hpp>
Chris@16 22 #include <boost/preprocessor/seq/for_each_product.hpp>
Chris@16 23 #include <boost/preprocessor/seq/size.hpp>
Chris@16 24 #include <boost/type_traits/add_const.hpp>
Chris@16 25 #include <boost/type_traits/remove_reference.hpp>
Chris@16 26
Chris@16 27 namespace boost { namespace detail {
Chris@16 28
Chris@16 29 # define BOOST_DETAIL_default_arg(z, n, _) \
Chris@16 30 typedef mpl::void_ BOOST_PP_CAT(arg, n);
Chris@16 31
Chris@16 32 # define BOOST_DETAIL_function_arg(z, n, _) \
Chris@16 33 typedef typename remove_reference< \
Chris@16 34 typename add_const< BOOST_PP_CAT(A, n) >::type \
Chris@16 35 >::type BOOST_PP_CAT(arg, n);
Chris@16 36
Chris@16 37 #define BOOST_DETAIL_cat_arg_counts(s, state, n) \
Chris@16 38 BOOST_PP_IF( \
Chris@16 39 n \
Chris@16 40 , BOOST_PP_CAT(state, BOOST_PP_CAT(_, n)) \
Chris@16 41 , state \
Chris@16 42 ) \
Chris@16 43 /**/
Chris@16 44
Chris@16 45 #define function_name \
Chris@16 46 BOOST_PP_SEQ_FOLD_LEFT( \
Chris@16 47 BOOST_DETAIL_cat_arg_counts \
Chris@16 48 , BOOST_PP_CAT(function, BOOST_PP_SEQ_HEAD(args)) \
Chris@16 49 , BOOST_PP_SEQ_TAIL(args)(0) \
Chris@16 50 ) \
Chris@16 51 /**/
Chris@16 52
Chris@16 53 template<typename F>
Chris@16 54 struct function_name
Chris@16 55 {
Chris@16 56 BOOST_PP_REPEAT(
Chris@16 57 BOOST_MPL_LIMIT_METAFUNCTION_ARITY
Chris@16 58 , BOOST_DETAIL_default_arg
Chris@16 59 , ~
Chris@16 60 )
Chris@16 61
Chris@16 62 template<typename Signature>
Chris@16 63 struct result {};
Chris@16 64
Chris@16 65 #define BOOST_DETAIL_function_result(r, _, n) \
Chris@16 66 template<typename This BOOST_PP_ENUM_TRAILING_PARAMS(n, typename A)> \
Chris@16 67 struct result<This(BOOST_PP_ENUM_PARAMS(n, A))> \
Chris@16 68 { \
Chris@16 69 BOOST_PP_REPEAT(n, BOOST_DETAIL_function_arg, ~) \
Chris@16 70 typedef \
Chris@16 71 typename BOOST_PP_CAT(mpl::apply, BOOST_MPL_LIMIT_METAFUNCTION_ARITY)<\
Chris@16 72 F \
Chris@16 73 BOOST_PP_ENUM_TRAILING_PARAMS( \
Chris@16 74 BOOST_MPL_LIMIT_METAFUNCTION_ARITY \
Chris@16 75 , arg \
Chris@16 76 ) \
Chris@16 77 >::type \
Chris@16 78 impl; \
Chris@16 79 typedef typename impl::result_type type; \
Chris@16 80 }; \
Chris@16 81 /**/
Chris@16 82
Chris@16 83 BOOST_PP_SEQ_FOR_EACH(BOOST_DETAIL_function_result, _, args)
Chris@16 84
Chris@16 85 # define arg_type(r, _, i, is_const) \
Chris@16 86 BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(A, i) BOOST_PP_CAT(const_if, is_const) &
Chris@16 87
Chris@16 88 # define result_(r, n, constness) \
Chris@16 89 typename result< \
Chris@16 90 function_name( \
Chris@16 91 BOOST_PP_SEQ_FOR_EACH_I_R(r, arg_type, ~, constness) \
Chris@16 92 ) \
Chris@16 93 > \
Chris@16 94 /**/
Chris@16 95
Chris@16 96 # define param(r, _, i, is_const) BOOST_PP_COMMA_IF(i) \
Chris@16 97 BOOST_PP_CAT(A, i) BOOST_PP_CAT(const_if, is_const) & BOOST_PP_CAT(x, i)
Chris@16 98
Chris@16 99 # define param_list(r, n, constness) \
Chris@16 100 BOOST_PP_SEQ_FOR_EACH_I_R(r, param, ~, constness)
Chris@16 101
Chris@16 102 # define call_operator(r, constness) \
Chris@16 103 template<BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(constness), typename A)> \
Chris@16 104 result_(r, BOOST_PP_SEQ_SIZE(constness), constness)::type \
Chris@16 105 operator ()( param_list(r, BOOST_PP_SEQ_SIZE(constness), constness) ) const \
Chris@16 106 { \
Chris@16 107 typedef result_(r, BOOST_PP_SEQ_SIZE(constness), constness)::impl impl; \
Chris@16 108 return impl()(BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(constness), x)); \
Chris@16 109 } \
Chris@16 110 /**/
Chris@16 111
Chris@16 112 # define const_if0
Chris@16 113 # define const_if1 const
Chris@16 114
Chris@16 115 # define bits(z, n, _) ((0)(1))
Chris@16 116
Chris@16 117 # define gen_operator(r, _, n) \
Chris@16 118 BOOST_PP_SEQ_FOR_EACH_PRODUCT_R( \
Chris@16 119 r \
Chris@16 120 , call_operator \
Chris@16 121 , BOOST_PP_REPEAT(n, bits, ~) \
Chris@16 122 ) \
Chris@16 123 /**/
Chris@16 124
Chris@16 125 BOOST_PP_SEQ_FOR_EACH(
Chris@16 126 gen_operator
Chris@16 127 , ~
Chris@16 128 , args
Chris@16 129 )
Chris@16 130
Chris@16 131 # undef bits
Chris@16 132 # undef const_if1
Chris@16 133 # undef const_if0
Chris@16 134 # undef call_operator
Chris@16 135 # undef param_list
Chris@16 136 # undef param
Chris@16 137 # undef result_
Chris@16 138 # undef default_
Chris@16 139 # undef arg_type
Chris@16 140 # undef gen_operator
Chris@16 141 # undef function_name
Chris@16 142
Chris@16 143 # undef args
Chris@16 144 };
Chris@16 145
Chris@16 146 }} // namespace boost::detail
Chris@16 147
Chris@16 148 //#endif // BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP