Chris@16: // Copyright David Abrahams 2006. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: // #include guards intentionally disabled. Chris@16: // #ifndef BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP Chris@16: // # define BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace detail { Chris@16: Chris@16: # define BOOST_DETAIL_default_arg(z, n, _) \ Chris@16: typedef mpl::void_ BOOST_PP_CAT(arg, n); Chris@16: Chris@16: # define BOOST_DETAIL_function_arg(z, n, _) \ Chris@16: typedef typename remove_reference< \ Chris@16: typename add_const< BOOST_PP_CAT(A, n) >::type \ Chris@16: >::type BOOST_PP_CAT(arg, n); Chris@16: Chris@16: #define BOOST_DETAIL_cat_arg_counts(s, state, n) \ Chris@16: BOOST_PP_IF( \ Chris@16: n \ Chris@16: , BOOST_PP_CAT(state, BOOST_PP_CAT(_, n)) \ Chris@16: , state \ Chris@16: ) \ Chris@16: /**/ Chris@16: Chris@16: #define function_name \ Chris@16: BOOST_PP_SEQ_FOLD_LEFT( \ Chris@16: BOOST_DETAIL_cat_arg_counts \ Chris@16: , BOOST_PP_CAT(function, BOOST_PP_SEQ_HEAD(args)) \ Chris@16: , BOOST_PP_SEQ_TAIL(args)(0) \ Chris@16: ) \ Chris@16: /**/ Chris@16: Chris@16: template Chris@16: struct function_name Chris@16: { Chris@16: BOOST_PP_REPEAT( Chris@16: BOOST_MPL_LIMIT_METAFUNCTION_ARITY Chris@16: , BOOST_DETAIL_default_arg Chris@16: , ~ Chris@16: ) Chris@16: Chris@16: template Chris@16: struct result {}; Chris@16: Chris@16: #define BOOST_DETAIL_function_result(r, _, n) \ Chris@16: template \ Chris@16: struct result \ Chris@16: { \ Chris@16: BOOST_PP_REPEAT(n, BOOST_DETAIL_function_arg, ~) \ Chris@16: typedef \ Chris@16: typename BOOST_PP_CAT(mpl::apply, BOOST_MPL_LIMIT_METAFUNCTION_ARITY)<\ Chris@16: F \ Chris@16: BOOST_PP_ENUM_TRAILING_PARAMS( \ Chris@16: BOOST_MPL_LIMIT_METAFUNCTION_ARITY \ Chris@16: , arg \ Chris@16: ) \ Chris@16: >::type \ Chris@16: impl; \ Chris@16: typedef typename impl::result_type type; \ Chris@16: }; \ Chris@16: /**/ Chris@16: Chris@16: BOOST_PP_SEQ_FOR_EACH(BOOST_DETAIL_function_result, _, args) Chris@16: Chris@16: # define arg_type(r, _, i, is_const) \ Chris@16: BOOST_PP_COMMA_IF(i) BOOST_PP_CAT(A, i) BOOST_PP_CAT(const_if, is_const) & Chris@16: Chris@16: # define result_(r, n, constness) \ Chris@16: typename result< \ Chris@16: function_name( \ Chris@16: BOOST_PP_SEQ_FOR_EACH_I_R(r, arg_type, ~, constness) \ Chris@16: ) \ Chris@16: > \ Chris@16: /**/ Chris@16: Chris@16: # define param(r, _, i, is_const) BOOST_PP_COMMA_IF(i) \ Chris@16: BOOST_PP_CAT(A, i) BOOST_PP_CAT(const_if, is_const) & BOOST_PP_CAT(x, i) Chris@16: Chris@16: # define param_list(r, n, constness) \ Chris@16: BOOST_PP_SEQ_FOR_EACH_I_R(r, param, ~, constness) Chris@16: Chris@16: # define call_operator(r, constness) \ Chris@16: template \ Chris@16: result_(r, BOOST_PP_SEQ_SIZE(constness), constness)::type \ Chris@16: operator ()( param_list(r, BOOST_PP_SEQ_SIZE(constness), constness) ) const \ Chris@16: { \ Chris@16: typedef result_(r, BOOST_PP_SEQ_SIZE(constness), constness)::impl impl; \ Chris@16: return impl()(BOOST_PP_ENUM_PARAMS(BOOST_PP_SEQ_SIZE(constness), x)); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: # define const_if0 Chris@16: # define const_if1 const Chris@16: Chris@16: # define bits(z, n, _) ((0)(1)) Chris@16: Chris@16: # define gen_operator(r, _, n) \ Chris@16: BOOST_PP_SEQ_FOR_EACH_PRODUCT_R( \ Chris@16: r \ Chris@16: , call_operator \ Chris@16: , BOOST_PP_REPEAT(n, bits, ~) \ Chris@16: ) \ Chris@16: /**/ Chris@16: Chris@16: BOOST_PP_SEQ_FOR_EACH( Chris@16: gen_operator Chris@16: , ~ Chris@16: , args Chris@16: ) Chris@16: Chris@16: # undef bits Chris@16: # undef const_if1 Chris@16: # undef const_if0 Chris@16: # undef call_operator Chris@16: # undef param_list Chris@16: # undef param Chris@16: # undef result_ Chris@16: # undef default_ Chris@16: # undef arg_type Chris@16: # undef gen_operator Chris@16: # undef function_name Chris@16: Chris@16: # undef args Chris@16: }; Chris@16: Chris@16: }} // namespace boost::detail Chris@16: Chris@16: //#endif // BOOST_DETAIL_FUNCTION_N_DWA2006514_HPP