summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/parameter/test/deduced.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/parameter/test/deduced.hpp')
-rw-r--r--src/boost/libs/parameter/test/deduced.hpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/src/boost/libs/parameter/test/deduced.hpp b/src/boost/libs/parameter/test/deduced.hpp
new file mode 100644
index 00000000..551bf1e5
--- /dev/null
+++ b/src/boost/libs/parameter/test/deduced.hpp
@@ -0,0 +1,131 @@
+// 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_DEDUCED_060920_HPP
+#define BOOST_DEDUCED_060920_HPP
+
+#include <boost/parameter/config.hpp>
+#include "basics.hpp"
+
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+#include <boost/mp11/map.hpp>
+#include <boost/mp11/algorithm.hpp>
+#else
+#include <boost/mpl/bool.hpp>
+#include <boost/mpl/if.hpp>
+#include <boost/mpl/for_each.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+#endif
+
+namespace test {
+
+ struct not_present_tag
+ {
+ };
+
+ not_present_tag not_present;
+
+ template <typename E, typename ArgPack>
+ class assert_expected
+ {
+ E const& _expected;
+ ArgPack const& _args;
+
+ public:
+ assert_expected(E const& e, ArgPack const& args_)
+ : _expected(e), _args(args_)
+ {
+ }
+
+ template <typename T>
+ static bool check_not_present(T const&)
+ {
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ static_assert(
+ std::is_same<T,test::not_present_tag>::value
+ , "T == test::not_present_tag"
+ );
+#else
+ BOOST_MPL_ASSERT((
+ typename boost::mpl::if_<
+ boost::is_same<T,test::not_present_tag>
+ , boost::mpl::true_
+ , boost::mpl::false_
+ >::type
+ ));
+#endif
+ return true;
+ }
+
+ template <typename K>
+ bool check1(K const& k, test::not_present_tag const& t, long) const
+ {
+ return assert_expected<E,ArgPack>::check_not_present(
+ this->_args[k | t]
+ );
+ }
+
+ template <typename K, typename Expected>
+ bool check1(K const& k, Expected const& e, int) const
+ {
+ return test::equal(this->_args[k], e);
+ }
+
+ template <typename K>
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ void operator()(K&&) const
+#else
+ void operator()(K) const
+#endif
+ {
+ boost::parameter::keyword<K> const&
+ k = boost::parameter::keyword<K>::instance;
+ BOOST_TEST(this->check1(k, this->_expected[k], 0L));
+ }
+ };
+
+ template <typename E, typename A>
+ void check0(E const& e, A const& args)
+ {
+#if defined(BOOST_PARAMETER_CAN_USE_MP11)
+ boost::mp11::mp_for_each<boost::mp11::mp_map_keys<E> >(
+ test::assert_expected<E,A>(e, args)
+ );
+#else
+ boost::mpl::for_each<E>(test::assert_expected<E,A>(e, args));
+#endif
+ }
+
+#if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
+ template <typename P, typename E, typename ...Args>
+ void check(E const& e, Args const&... args)
+ {
+ test::check0(e, P()(args...));
+ }
+#else
+ template <typename P, typename E, typename A0>
+ void check(E const& e, A0 const& a0)
+ {
+ test::check0(e, P()(a0));
+ }
+
+ template <typename P, typename E, typename A0, typename A1>
+ void check(E const& e, A0 const& a0, A1 const& a1)
+ {
+ test::check0(e, P()(a0, a1));
+ }
+
+ template <typename P, typename E, typename A0, typename A1, typename A2>
+ void check(E const& e, A0 const& a0, A1 const& a1, A2 const& a2)
+ {
+ test::check0(e, P()(a0, a1, a2));
+ }
+#endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
+} // namespace test
+
+#endif // include guard
+