From 311f8bf1a596b1f5b388c0b66dec48d8dd02bcaa Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 7 Jan 2019 22:30:58 +0200 Subject: [PATCH] Add mp_set_intersection --- include/boost/mp11/set.hpp | 29 +++++++++++++++++++++ test/Jamfile | 1 + test/mp_set_intersection.cpp | 49 ++++++++++++++++++++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 test/mp_set_intersection.cpp diff --git a/include/boost/mp11/set.hpp b/include/boost/mp11/set.hpp index 54f5f42..45ba982 100644 --- a/include/boost/mp11/set.hpp +++ b/include/boost/mp11/set.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -134,6 +135,34 @@ template struct mp_set_union_impl using mp_set_union = typename detail::mp_set_union_impl::type; +// mp_set_intersection +namespace detail +{ + +template struct in_all_sets +{ + template using fn = mp_all< mp_set_contains... >; +}; + +template using mp_set_intersection_ = mp_copy_if_q>; + +template struct mp_set_intersection_impl +{ +}; + +template<> struct mp_set_intersection_impl<> +{ + using type = mp_list<>; +}; + +template struct mp_set_intersection_impl: mp_defer +{ +}; + +} // namespace detail + +template using mp_set_intersection = typename detail::mp_set_intersection_impl::type; + // mp_set_difference namespace detail { diff --git a/test/Jamfile b/test/Jamfile index ba715e3..16509e6 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -137,6 +137,7 @@ run mp_set_union.cpp ; run mp_set_union_sf.cpp ; run mp_set_difference.cpp ; run mp_set_difference_sf.cpp ; +run mp_set_intersection.cpp ; # function run mp_all.cpp ; diff --git a/test/mp_set_intersection.cpp b/test/mp_set_intersection.cpp new file mode 100644 index 0000000..d9e16dd --- /dev/null +++ b/test/mp_set_intersection.cpp @@ -0,0 +1,49 @@ + +// 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_intersection; + + 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>, 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(); +}