summaryrefslogtreecommitdiff
path: root/boost/parameter/aux_/pp_impl/argument_pack.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/parameter/aux_/pp_impl/argument_pack.hpp')
-rw-r--r--boost/parameter/aux_/pp_impl/argument_pack.hpp91
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
+