diff options
Diffstat (limited to 'boost/parameter/aux_/pp_impl/argument_pack.hpp')
-rw-r--r-- | boost/parameter/aux_/pp_impl/argument_pack.hpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/boost/parameter/aux_/pp_impl/argument_pack.hpp b/boost/parameter/aux_/pp_impl/argument_pack.hpp new file mode 100644 index 0000000000..85bf13f744 --- /dev/null +++ b/boost/parameter/aux_/pp_impl/argument_pack.hpp @@ -0,0 +1,91 @@ +// Copyright Daniel Wallin 2006. +// Copyright Cromwell D. Enage 2017. +// 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) + +#ifndef BOOST_PARAMETER_AUX_PP_IMPL_ARGUMENT_PACK_HPP +#define BOOST_PARAMETER_AUX_PP_IMPL_ARGUMENT_PACK_HPP + +#include <boost/parameter/aux_/pack/tag_keyword_arg.hpp> +#include <boost/parameter/aux_/pack/make_arg_list.hpp> +#include <boost/parameter/config.hpp> + +#if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) +#include <boost/parameter/aux_/pack/make_parameter_spec_items.hpp> + +#if defined(BOOST_PARAMETER_CAN_USE_MP11) +#include <boost/mp11/integral.hpp> +#include <boost/mp11/list.hpp> +#else +#include <boost/mpl/bool.hpp> +#include <boost/mpl/pair.hpp> +#endif + +namespace boost { namespace parameter { namespace aux { + + template <typename Parameters, typename ...Args> + struct argument_pack + { + typedef typename ::boost::parameter::aux::make_arg_list< + typename ::boost::parameter::aux::make_parameter_spec_items< + typename Parameters::parameter_spec + , Args... + >::type + , typename Parameters::deduced_list + , ::boost::parameter::aux::tag_keyword_arg +#if defined(BOOST_PARAMETER_CAN_USE_MP11) + , ::boost::mp11::mp_false +#else + , ::boost::mpl::false_ +#endif + >::type result; +#if defined(BOOST_PARAMETER_CAN_USE_MP11) + using type = ::boost::mp11::mp_at_c<result,0>; +#else + typedef typename ::boost::mpl::first<result>::type type; +#endif + }; +}}} // namespace boost::parameter::aux + +#else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) +#include <boost/parameter/aux_/void.hpp> +#include <boost/parameter/aux_/pack/make_items.hpp> +#include <boost/parameter/aux_/preprocessor/no_perfect_forwarding_begin.hpp> +#include <boost/preprocessor/facilities/intercept.hpp> +#include <boost/preprocessor/repetition/enum_trailing_binary_params.hpp> +#include <boost/mpl/bool.hpp> +#include <boost/mpl/pair.hpp> + +namespace boost { namespace parameter { namespace aux { + + template < + typename Parameters + BOOST_PP_ENUM_TRAILING_BINARY_PARAMS( + BOOST_PARAMETER_MAX_ARITY + , typename A + , = ::boost::parameter::void_ BOOST_PP_INTERCEPT + ) + > + struct argument_pack + { + typedef typename ::boost::parameter::aux::make_arg_list< + typename BOOST_PARAMETER_build_arg_list( + BOOST_PARAMETER_MAX_ARITY + , ::boost::parameter::aux::make_items + , typename Parameters::parameter_spec + , A + )::type + , typename Parameters::deduced_list + , ::boost::parameter::aux::tag_keyword_arg + , ::boost::mpl::false_ + >::type result; + typedef typename ::boost::mpl::first<result>::type type; + }; +}}} // namespace boost::parameter::aux + +#include <boost/parameter/aux_/preprocessor/no_perfect_forwarding_end.hpp> + +#endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING +#endif // include guard + |