diff options
Diffstat (limited to 'boost/parameter/aux_/preprocessor/overloads.hpp')
-rw-r--r-- | boost/parameter/aux_/preprocessor/overloads.hpp | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/boost/parameter/aux_/preprocessor/overloads.hpp b/boost/parameter/aux_/preprocessor/overloads.hpp new file mode 100644 index 0000000000..4f2685616d --- /dev/null +++ b/boost/parameter/aux_/preprocessor/overloads.hpp @@ -0,0 +1,92 @@ +// Copyright David Abrahams, Daniel Wallin 2003. +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +// This file generates overloads in this format: +// +// template <typename A0, typename A1> +// typename ::boost::mpl::apply_wrap1< +// ::boost::parameter::aux::make_arg_list< +// PS0,A0 +// , ::boost::parameter::aux::make_arg_list< +// PS1,A1 +// , ::boost::mpl::identity< +// ::boost::parameter::aux::empty_arg_list +// > +// > +// > +// , unnamed_list +// >::type +// operator()(A0 const& a0, A1 const& a1) const +// { +// typedef typename ::boost::mpl::apply_wrap1< +// ::boost::parameter::aux::make_arg_list< +// PS0,A0 +// , ::boost::parameter::aux::make_arg_list< +// PS1,A1 +// , ::boost::mpl::identity< +// ::boost::parameter::aux::empty_arg_list +// > +// > +// > +// >::type arg_tuple; +// +// return arg_tuple( +// a0 +// , a1 +// , ::boost::parameter::aux::void_() +// ... +// ); +// } +// + +#if !defined(BOOST_PP_IS_ITERATING) +# error Boost.Parameters - do not include this file! +#endif + +#define N BOOST_PP_ITERATION() + +#define BOOST_PARAMETER_open_list(z, n, text) \ + ::boost::parameter::aux::item< \ + BOOST_PP_CAT(PS, n), BOOST_PP_CAT(A, n) + +#define BOOST_PARAMETER_close_list(z, n, text) > + +#define BOOST_PARAMETER_arg_list(n) \ + ::boost::parameter::aux::make_arg_list< \ + BOOST_PP_ENUM(N, BOOST_PARAMETER_open_list, _) \ + , ::boost::parameter::void_ \ + BOOST_PP_REPEAT(N, BOOST_PARAMETER_close_list, _) \ + , deduced_list \ + , ::boost::parameter::aux::tag_keyword_arg \ + > + +#define BOOST_PARAMETER_arg_pack_init(z, n, limit) \ + BOOST_PP_CAT(a, BOOST_PP_SUB(limit, n)) + +template <BOOST_PP_ENUM_PARAMS(N, typename A)> +typename ::boost::mpl::first< + typename BOOST_PARAMETER_arg_list(N)::type +>::type + operator()(BOOST_PP_ENUM_BINARY_PARAMS(N, A, & a)) const +{ + typedef typename BOOST_PARAMETER_arg_list(N)::type result; + typedef typename ::boost::mpl::first<result>::type result_type; + typedef typename ::boost::mpl::second<result>::type error; + error(); + + return result_type( + BOOST_PP_ENUM(N, BOOST_PARAMETER_arg_pack_init, BOOST_PP_DEC(N)) + BOOST_PP_ENUM_TRAILING_PARAMS( + BOOST_PP_SUB(BOOST_PARAMETER_COMPOSE_MAX_ARITY, N) + , ::boost::parameter::aux::void_reference() BOOST_PP_INTERCEPT + ) + ); +} + +#undef BOOST_PARAMETER_arg_list +#undef BOOST_PARAMETER_close_list +#undef BOOST_PARAMETER_open_list +#undef N + |