From 0837acfde123725962ee5d4220aa63b48dd9eef7 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Fri, 12 Mar 2021 06:18:45 +0200 Subject: [PATCH] Add mp_split (refs #59) --- include/boost/mp11/algorithm.hpp | 23 ++++++++++++++ test/Jamfile | 1 + test/mp_split.cpp | 51 ++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 test/mp_split.cpp diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index f936a67..40a8c55 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -1240,6 +1240,7 @@ template using mp_pairwise_fold_impl = mp_transform_q using mp_pairwise_fold_q = mp_eval_if, mp_clear, detail::mp_pairwise_fold_impl, L, Q>; template class F> using mp_pairwise_fold = mp_pairwise_fold_q>; +// mp_intersperse namespace detail { @@ -1273,6 +1274,28 @@ template class L, class T1, class... T, class S> struct mp_in template using mp_intersperse = typename detail::mp_intersperse_impl::type; +// mp_split +namespace detail +{ + +template struct mp_split_impl; + +} // namespace detail + +template using mp_split = typename detail::mp_split_impl>::type; + +namespace detail +{ + +template using mp_split_impl_ = mp_push_front, S>, mp_take>; + +template struct mp_split_impl +{ + using type = mp_eval_if_c::value == J::value, mp_push_back, L>, mp_split_impl_, L, S, J>; +}; + +} // namespace detail + } // namespace mp11 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index 25e7d6b..531e598 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -125,6 +125,7 @@ run mp_iterate.cpp ; run mp_pairwise_fold.cpp ; run mp_pairwise_fold_q.cpp ; run mp_intersperse.cpp ; +run mp_split.cpp ; # integral run integral.cpp ; diff --git a/test/mp_split.cpp b/test/mp_split.cpp new file mode 100644 index 0000000..0cea072 --- /dev/null +++ b/test/mp_split.cpp @@ -0,0 +1,51 @@ +// Copyright 2021 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include +#include + +struct X1 {}; +struct X2 {}; +struct X3 {}; +struct X4 {}; + +struct S {}; + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_split; + + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, mp_list, mp_list<>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, mp_list, mp_list<>, mp_list<>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, mp_list, mp_list<>, mp_list<>, mp_list<>>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, mp_list, mp_list, mp_list<>, mp_list, mp_list<>>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void>, std::tuple>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, std::tuple, std::tuple<>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, std::tuple, std::tuple<>, std::tuple<>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, std::tuple, std::tuple<>, std::tuple<>, std::tuple<>>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, std::tuple, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, std::tuple, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, S>, std::tuple, std::tuple, std::tuple<>, std::tuple, std::tuple<>>>)); + + return boost::report_errors(); +}