From 3a31eeee29f3aa166f922c94aeb197b2b3fa763b Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 7 Jan 2019 21:02:30 +0200 Subject: [PATCH] Add mp_set_difference --- include/boost/mp11/set.hpp | 15 ++++++++++++ test/Jamfile | 1 + test/mp_set_difference.cpp | 48 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 test/mp_set_difference.cpp diff --git a/include/boost/mp11/set.hpp b/include/boost/mp11/set.hpp index 413af7a..b3917db 100644 --- a/include/boost/mp11/set.hpp +++ b/include/boost/mp11/set.hpp @@ -9,8 +9,10 @@ // http://www.boost.org/LICENSE_1_0.txt #include +#include #include #include +#include #include namespace boost @@ -131,6 +133,19 @@ template struct mp_set_union_impl using mp_set_union = typename detail::mp_set_union_impl::type; +// mp_set_difference +namespace detail +{ + +template struct in_any_set +{ + template using fn = mp_any< mp_set_contains... >; +}; + +} // namespace detail + +template using mp_set_difference = mp_remove_if_q>; + } // namespace mp11 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index 010309b..ba34e7a 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -135,6 +135,7 @@ run mp_set_push_front.cpp ; run mp_is_set.cpp ; run mp_set_union.cpp ; run mp_set_union_sf.cpp ; +run mp_set_difference.cpp ; # function run mp_all.cpp ; diff --git a/test/mp_set_difference.cpp b/test/mp_set_difference.cpp new file mode 100644 index 0000000..9e21f40 --- /dev/null +++ b/test/mp_set_difference.cpp @@ -0,0 +1,48 @@ + +// Copyright 2019 Peter Dimov. +// +// 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 + + +#include +#include +#include +#include +#include +#include + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_set_difference; + + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, mp_list>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>, std::tuple>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>, mp_list<>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>, std::pair>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, std::pair>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, std::pair>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, std::pair>, std::tuple>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, std::tuple<>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, std::tuple>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, std::tuple>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, std::tuple>, mp_list<>>)); + + return boost::report_errors(); +}