diff --git a/doc/mp11/algorithm.adoc b/doc/mp11/algorithm.adoc index 8af370a..0a48054 100644 --- a/doc/mp11/algorithm.adoc +++ b/doc/mp11/algorithm.adoc @@ -320,6 +320,8 @@ As `mp_product`, but takes a quoted metafunction. `mp_drop_c` removes the first `N` elements of `L` and returns the result. +Supports a value list as `L` under {cpp}17. + .mp_drop_c [cols="<.^4m,6*^.^1m",width=85%] |=== diff --git a/doc/mp11/changelog.adoc b/doc/mp11/changelog.adoc index f21b01c..2399804 100644 --- a/doc/mp11/changelog.adoc +++ b/doc/mp11/changelog.adoc @@ -15,7 +15,7 @@ http://www.boost.org/LICENSE_1_0.txt * Added an offset/from parameter to `mp_from_sequence`, `mp_iota`, `mp_iota_c`. * Added `mp_value`, `mp_list_v`, `mp_rename_v`, `mp_is_value_list`. * Added value list support to the primitives in ``. -* Added value list support to `mp_repeat`, `mp_fill`, `mp_at`, `mp_back`, `mp_take`, `mp_pop_back`. +* Added value list support to `mp_repeat`, `mp_fill`, `mp_at`, `mp_back`, `mp_take`, `mp_pop_back`, `mp_drop`. ## Changes in 1.79.0 diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 7d7e579..75299fb 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -316,7 +316,7 @@ template class L, class... T, template class L2, cl } // namespace detail -template using mp_drop_c = typename detail::mp_drop_impl, N>, mp_bool::value>>::type; +template using mp_drop_c = mp_assign, mp_repeat_c, N>, mp_bool::value>>::type>; template using mp_drop = mp_drop_c; diff --git a/test/Jamfile b/test/Jamfile index 5e4bc90..859b4d5 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -91,6 +91,7 @@ run mp_repeat_2.cpp ; run mp_repeat_3.cpp ; run mp_product.cpp ; run mp_drop.cpp ; +run mp_drop_2.cpp ; run mp_iota.cpp ; run mp_iota_2.cpp ; run mp_at.cpp ; diff --git a/test/mp_drop_2.cpp b/test/mp_drop_2.cpp new file mode 100644 index 0000000..d9c58dc --- /dev/null +++ b/test/mp_drop_2.cpp @@ -0,0 +1,98 @@ +// Copyright 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +#if !defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +#pragma message("Test skipped because BOOST_MP11_HAS_TEMPLATE_AUTO is not defined") +int main() {} + +#else + +#include + +template struct V1 {}; +template struct V2 {}; + +int main() +{ + using boost::mp11::mp_drop; + using boost::mp11::mp_drop_c; + using boost::mp11::mp_size_t; + + { + using L1 = V1<>; + + BOOST_TEST_TRAIT_SAME(mp_drop_c, L1); + BOOST_TEST_TRAIT_SAME(mp_drop>, L1); + + using L2 = V1; + + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1<0, true, 1, std::size_t(2)>); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1<1, std::size_t(2)>); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1<>); + + BOOST_TEST_TRAIT_SAME(mp_drop>, V1); + BOOST_TEST_TRAIT_SAME(mp_drop>, V1<0, true, 1, std::size_t(2)>); + BOOST_TEST_TRAIT_SAME(mp_drop>, V1); + BOOST_TEST_TRAIT_SAME(mp_drop>, V1<1, std::size_t(2)>); + BOOST_TEST_TRAIT_SAME(mp_drop>, V1); + BOOST_TEST_TRAIT_SAME(mp_drop>, V1<>); + } + + { + using L1 = V2<>; + + BOOST_TEST_TRAIT_SAME(mp_drop_c, L1); + BOOST_TEST_TRAIT_SAME(mp_drop>, L1); + + using L2 = V2<1, 2, 3, 4, 5>; + + BOOST_TEST_TRAIT_SAME(mp_drop_c, V2<1, 2, 3, 4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V2<2, 3, 4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V2<3, 4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V2<4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V2<5>); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V2<>); + + BOOST_TEST_TRAIT_SAME(mp_drop>, V2<1, 2, 3, 4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop>, V2<2, 3, 4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop>, V2<3, 4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop>, V2<4, 5>); + BOOST_TEST_TRAIT_SAME(mp_drop>, V2<5>); + BOOST_TEST_TRAIT_SAME(mp_drop>, V2<>); + } + + using boost::mp11::mp_iota_c; + using boost::mp11::mp_rename_v; + + { + using L1 = mp_rename_v, V1>; + + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1); + BOOST_TEST_TRAIT_SAME(mp_drop_c, V1<>); + } + + using boost::mp11::mp_valid; + + { + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<0>>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<1>>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<2>>)); + BOOST_TEST_TRAIT_TRUE((mp_valid, mp_size_t<3>>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<4>>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_size_t<5>>)); + } + + return boost::report_errors(); +} + +#endif