From 0c491bcd77ebd40a78ef97aba9f4c129731eaaf1 Mon Sep 17 00:00:00 2001 From: Braden Ganetsky Date: Mon, 27 Nov 2023 19:07:38 -0600 Subject: [PATCH 1/3] Move mp_slice_c and mp_slice into the public API --- include/boost/mp11/algorithm.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index a469f89..b40dfd9 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -473,6 +473,10 @@ struct mp_take_c_impl, typen template using mp_take_c = mp_assign>::type>; template using mp_take = mp_take_c; +// mp_slice(_c) +template using mp_slice_c = mp_drop_c< mp_take_c, I >; +template using mp_slice = mp_drop< mp_take, I >; + // mp_back template using mp_back = mp_at_c::value - 1>; @@ -1265,9 +1269,6 @@ template class F> using mp_pairwise_fold = mp_pairwi namespace detail { -template using mp_slice_c = mp_drop_c< mp_take_c, I >; -template using mp_slice = mp_drop< mp_take, I >; - template struct mp_sliding_fold_impl; template struct mp_sliding_fold_impl From 56a9b7db1c47a87a4e69e67defa7e3c05c553c14 Mon Sep 17 00:00:00 2001 From: Braden Ganetsky Date: Mon, 27 Nov 2023 19:08:10 -0600 Subject: [PATCH 2/3] Add mp_slice_c and mp_slice to the adoc file --- doc/mp11/algorithm.adoc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/doc/mp11/algorithm.adoc b/doc/mp11/algorithm.adoc index a3b4553..2e5e126 100644 --- a/doc/mp11/algorithm.adoc +++ b/doc/mp11/algorithm.adoc @@ -414,6 +414,28 @@ Supports a value list as `L` under {cpp}17. Same as `mp_take_c`, but with a type argument `N`. `N::value` must be a nonnegative number. +## mp_slice_c + + template using mp_slice_c = mp_drop_c, I>; + +`mp_slice_c` returns a list of the same form as `L` containing the elements from index `I` (inclusive) to index `J` (exclusive). + +Supports a value list as `L` under {cpp}17. + +.mp_slice_c +[cols="<.^4m,8*^.^1m",width=85%] +|=== +|*L1*|A~0~|...|A~i~|...|A~j-1~|A~j~|...|A~n-1~ +9+| +|*mp_slice_c* 2+>||A~i~|...|A~j-1~ 3+| +|=== + +## mp_slice + + template using mp_slice = mp_drop, I>; + +Same as `mp_slice_c`, but with type arguments `I` and `J`. `I::value` and `J::value` must be nonnegative numbers. + ## mp_back template using mp_back = mp_at_c::value - 1>; From b052fa1bc5ca34d7116aa0807f7b3ddb5623e3c0 Mon Sep 17 00:00:00 2001 From: Braden Ganetsky Date: Mon, 27 Nov 2023 19:08:40 -0600 Subject: [PATCH 3/3] Add mp_slice_c and mp_slice tests --- test/Jamfile | 1 + test/mp_slice.cpp | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 test/mp_slice.cpp diff --git a/test/Jamfile b/test/Jamfile index 510da30..445f10c 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -99,6 +99,7 @@ run mp_at_2.cpp ; run mp_at_sf.cpp : : : gcc-4.7:all ; run mp_take.cpp ; run mp_take_2.cpp ; +run mp_slice.cpp ; run mp_replace.cpp ; run mp_replace_if.cpp ; run mp_replace_if_q.cpp ; diff --git a/test/mp_slice.cpp b/test/mp_slice.cpp new file mode 100644 index 0000000..867eb55 --- /dev/null +++ b/test/mp_slice.cpp @@ -0,0 +1,118 @@ +// Copyright 2023 Braden Ganetsky (braden.ganetsky@gmail.com) +// +// 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 + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_size_t; + using boost::mp11::mp_slice_c; + using boost::mp11::mp_slice; + + { + using L1 = 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, 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, 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, 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, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<0>>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, mp_list<>>)); + } + + { + using L2 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<0>>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>>, std::tuple<>>)); + } + + return boost::report_errors(); +}