7b2d3f6e41
Argument packs qualify as Boost.MP11-style maps as well as MPL sequences. These maps store the keyword tag types as their keys.
132 lines
3.4 KiB
C++
132 lines
3.4 KiB
C++
// 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
|
|
|