diff --git a/doc/mp11/algorithm.adoc b/doc/mp11/algorithm.adoc index 95b9d73..ce9f0dc 100644 --- a/doc/mp11/algorithm.adoc +++ b/doc/mp11/algorithm.adoc @@ -19,6 +19,10 @@ http://www.boost.org/LICENSE_1_0.txt `mp_transform, L2, ..., Ln>` applies `F` to each successive tuple of elements and returns `L1...>`. +Has limited support of value lists as `L...` under {cpp}17 (for one to three lists.) +In that case, elements are wrapped with `mp_value` before being passed to `F`, and +are unwrapped afterwards. The result is `L1, mp_value, ...>::value...>`. + .Using mp_transform to produce a list of pointers from a list of pointees ``` template using add_pointer_t = @@ -414,6 +418,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>; @@ -699,6 +725,8 @@ Like `mp_nth_element`, but takes a quoted metafunction. It's equivalent to `mp_fold, mp_first, F>`, where `F` returns `mp_if, T, U>`. +Supports a value list as `L` under {cpp}17. In that case, the element is returned wrapped with `mp_value`. + ## mp_min_element_q template using mp_min_element_q = mp_min_element; @@ -713,6 +741,8 @@ As `mp_min_element`, but takes a quoted metafunction. It's equivalent to `mp_fold, mp_first, F>`, where `F` returns `mp_if, T, U>`. +Supports a value list as `L` under {cpp}17. In that case, the element is returned wrapped with `mp_value`. + ## mp_max_element_q template using mp_max_element_q = mp_max_element; @@ -846,6 +876,39 @@ template class P> using is_sorted = mp_none_of>, mp_to_bool>; ---- +## mp_sliding_fold + + template class F> using mp_sliding_fold = /*...*/; + +`mp_sliding_fold` returns a list of the same form as `L` whose elements are +the result of the application of the n-ary metafunction `F` to each n-tuple of adjacent +elements of `L`. That is, `mp_sliding_fold, mp_size_t<3>, F>` is +`L, F>`. + +The result has `N-1` fewer elements than the original. +If `L` has fewer than `N::value` elements, the result is an empty list. + +.Using mp_sliding_fold +---- +template using local_maximum = + mp_sliding_fold; +---- + +## mp_sliding_fold_q + + template using mp_sliding_fold_q = + mp_sliding_fold; + +As `mp_sliding_fold`, but takes a quoted metafunction. + +.Using mp_sliding_fold_q +---- +struct average { template using fn = mp_int::value / sizeof...(C)>; }; + +template using moving_average = + mp_sliding_fold_q; +---- + ## mp_iterate template class F, template class R> diff --git a/doc/mp11/changelog.adoc b/doc/mp11/changelog.adoc index f3fb9b4..59f3d17 100644 --- a/doc/mp11/changelog.adoc +++ b/doc/mp11/changelog.adoc @@ -1,5 +1,5 @@ //// -Copyright 2019-2020 Peter Dimov +Copyright 2019-2023 Peter Dimov Distributed under the Boost Software License, Version 1.0. @@ -10,6 +10,13 @@ http://www.boost.org/LICENSE_1_0.txt [#changelog] # Revision History +## Changes in 1.85.0 + +* Added `mp_sliding_fold`, a generalization of `mp_pairwise_fold` (contributed by Braden Ganetsky) +* Added `mp_slice` (thanks to Braden Ganetsky) +* Added value list support to `mp_min_element`, `mp_max_element`. +* Added limited value list support to `mp_transform`. + ## Changes in 1.83.0 * Added an offset/from parameter to `mp_from_sequence`, `mp_iota`, `mp_iota_c`. diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index be377f5..8f80244 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -26,6 +26,11 @@ #include #include +#if defined(_MSC_VER) || defined(__GNUC__) +# pragma push_macro( "I" ) +# undef I +#endif + namespace boost { namespace mp11 @@ -84,6 +89,25 @@ template class F, template class L1, class... T1, t #endif }; +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class F, template class L, auto... A> struct mp_transform_impl> +{ + using type = L< F< mp_value >::value... >; +}; + +template class F, template class L1, auto... A1, template class L2, auto... A2> struct mp_transform_impl, L2> +{ + using type = L1< F< mp_value, mp_value >::value... >; +}; + +template class F, template class L1, auto... A1, template class L2, auto... A2, template class L3, auto... A3> struct mp_transform_impl, L2, L3> +{ + using type = L1< F< mp_value, mp_value, mp_value >::value... >; +}; + +#endif + #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, == 1900 ) || BOOST_MP11_WORKAROUND( BOOST_MP11_GCC, < 40800 ) template using mp_same_size_1 = mp_same...>; @@ -473,6 +497,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>; @@ -1261,6 +1289,33 @@ 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_sliding_fold +namespace detail +{ + +template struct mp_sliding_fold_impl; + +template struct mp_sliding_fold_impl +{ + static const std::size_t M = mp_size::value - N::value + 1; + + template using F = mp_slice_c; + + using J = mp_transform>; + + using type = mp_apply>; +}; + +template struct mp_sliding_fold_impl +{ + using type = mp_clear; +}; + +} // namespace detail + +template using mp_sliding_fold_q = typename detail::mp_sliding_fold_impl::value >= N::value)>, L, N, Q>::type; +template class F> using mp_sliding_fold = mp_sliding_fold_q>; + // mp_intersperse namespace detail { @@ -1324,4 +1379,8 @@ template using mp_join = mp_apply #include +#if defined(_MSC_VER) || defined(__GNUC__) +# pragma push_macro( "I" ) +# undef I +#endif + namespace boost { namespace mp11 @@ -108,4 +113,8 @@ template using mp_bind_q = mp_bind; } // namespace mp11 } // namespace boost +#if defined(_MSC_VER) || defined(__GNUC__) +# pragma pop_macro( "I" ) +#endif + #endif // #ifndef BOOST_MP11_BIND_HPP_INCLUDED diff --git a/include/boost/mp11/detail/mp_fold.hpp b/include/boost/mp11/detail/mp_fold.hpp index 266d9c1..e2c464c 100644 --- a/include/boost/mp11/detail/mp_fold.hpp +++ b/include/boost/mp11/detail/mp_fold.hpp @@ -10,6 +10,8 @@ #include #include +#include +#include namespace boost { @@ -155,7 +157,7 @@ struct mp_fold_impl, V, F> } // namespace detail -template class F> using mp_fold = typename detail::mp_fold_impl::type; +template class F> using mp_fold = typename detail::mp_fold_impl, V, F>::type; template using mp_fold_q = mp_fold; } // namespace mp11 diff --git a/include/boost/mp11/integer_sequence.hpp b/include/boost/mp11/integer_sequence.hpp index 83e2450..013991f 100644 --- a/include/boost/mp11/integer_sequence.hpp +++ b/include/boost/mp11/integer_sequence.hpp @@ -11,6 +11,11 @@ #include #include +#if defined(_MSC_VER) || defined(__GNUC__) +# pragma push_macro( "I" ) +# undef I +#endif + #if defined(__has_builtin) # if __has_builtin(__make_integer_seq) # define BOOST_MP11_HAS_MAKE_INTEGER_SEQ @@ -109,4 +114,8 @@ template using index_sequence_for = make_integer_sequence #include +#if defined(_MSC_VER) || defined(__GNUC__) +# pragma push_macro( "I" ) +# undef I +#endif + namespace boost { namespace mp11 @@ -39,4 +44,8 @@ template using mp_size_t = std::integral_constant } // namespace mp11 } // namespace boost +#if defined(_MSC_VER) || defined(__GNUC__) +# pragma pop_macro( "I" ) +#endif + #endif // #ifndef BOOST_MP11_INTEGRAL_HPP_INCLUDED diff --git a/include/boost/mp11/list.hpp b/include/boost/mp11/list.hpp index 3646764..46b5605 100644 --- a/include/boost/mp11/list.hpp +++ b/include/boost/mp11/list.hpp @@ -19,6 +19,11 @@ #include #include +#if defined(_MSC_VER) || defined(__GNUC__) +# pragma push_macro( "I" ) +# undef I +#endif + namespace boost { namespace mp11 @@ -469,4 +474,8 @@ template using mp_transform_third_q = mp_transform_thirdgcc-4.7:all ; run mp_take.cpp ; run mp_take_2.cpp ; +run mp_slice.cpp ; +run mp_slice_2.cpp ; run mp_replace.cpp ; run mp_replace_if.cpp ; run mp_replace_if_q.cpp ; @@ -141,9 +146,13 @@ run mp_with_index_cx.cpp ; run mp_from_sequence.cpp ; run mp_from_sequence_2.cpp ; run mp_min_element.cpp ; +run mp_min_element_2.cpp ; run mp_min_element_q.cpp ; +run mp_min_element_q_2.cpp ; run mp_max_element.cpp ; +run mp_max_element_2.cpp ; run mp_max_element_q.cpp ; +run mp_max_element_q_2.cpp ; run mp_nth_element.cpp ; run mp_nth_element_q.cpp ; run mp_back.cpp ; @@ -158,6 +167,8 @@ run mp_partial_sum.cpp ; run mp_iterate.cpp ; run mp_pairwise_fold.cpp ; run mp_pairwise_fold_q.cpp ; +run mp_sliding_fold.cpp ; +run mp_sliding_fold_q.cpp ; run mp_intersperse.cpp ; run mp_split.cpp ; run mp_join.cpp ; diff --git a/test/complex_h.cpp b/test/complex_h.cpp new file mode 100644 index 0000000..63d2675 --- /dev/null +++ b/test/complex_h.cpp @@ -0,0 +1,12 @@ +// Copyright 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#define _SILENCE_CXX17_C_HEADER_DEPRECATION_WARNING + +#include +#include + +int main() +{ +} diff --git a/test/mp_max_element_2.cpp b/test/mp_max_element_2.cpp new file mode 100644 index 0000000..966a698 --- /dev/null +++ b/test/mp_max_element_2.cpp @@ -0,0 +1,58 @@ +// Copyright 2017, 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_max_element; + using boost::mp11::mp_less; + using boost::mp11::mp_int; + + { + using L1 = V1<1>; + BOOST_TEST_TRAIT_SAME(mp_max_element, mp_int<1>); + + using L2 = V1<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_max_element, mp_int<4>); + + using L3 = V1<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_max_element, mp_int<3>); + + using L4 = V1<-1, 1u, -2, 2u>; + BOOST_TEST_TRAIT_SAME(mp_max_element, std::integral_constant); + } + + { + using L1 = V2<1>; + BOOST_TEST_TRAIT_SAME(mp_max_element, mp_int<1>); + + using L2 = V2<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_max_element, mp_int<4>); + + using L3 = V2<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_max_element, mp_int<3>); + + using L4 = V2<-1, 1, -2, 2>; + BOOST_TEST_TRAIT_SAME(mp_max_element, mp_int<2>); + } + + return boost::report_errors(); +} + +#endif diff --git a/test/mp_max_element_q_2.cpp b/test/mp_max_element_q_2.cpp new file mode 100644 index 0000000..4956d8a --- /dev/null +++ b/test/mp_max_element_q_2.cpp @@ -0,0 +1,61 @@ +// Copyright 2017, 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_max_element_q; + using boost::mp11::mp_less; + using boost::mp11::mp_int; + using boost::mp11::mp_quote; + + using Q = mp_quote; + + { + using L1 = V1<1>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, mp_int<1>); + + using L2 = V1<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, mp_int<4>); + + using L3 = V1<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, mp_int<3>); + + using L4 = V1<-1, 1u, -2, 2u>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, std::integral_constant); + } + + { + using L1 = V2<1>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, mp_int<1>); + + using L2 = V2<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, mp_int<4>); + + using L3 = V2<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, mp_int<3>); + + using L4 = V2<-1, 1, -2, 2>; + BOOST_TEST_TRAIT_SAME(mp_max_element_q, mp_int<2>); + } + + return boost::report_errors(); +} + +#endif diff --git a/test/mp_min_element_2.cpp b/test/mp_min_element_2.cpp new file mode 100644 index 0000000..8089964 --- /dev/null +++ b/test/mp_min_element_2.cpp @@ -0,0 +1,58 @@ +// Copyright 2017, 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_min_element; + using boost::mp11::mp_less; + using boost::mp11::mp_int; + + { + using L1 = V1<1>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<1>); + + using L2 = V1<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<1>); + + using L3 = V1<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<1>); + + using L4 = V1<-1, 1u, -2, 2u>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<-2>); + } + + { + using L1 = V2<1>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<1>); + + using L2 = V2<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<1>); + + using L3 = V2<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<1>); + + using L4 = V2<-1, 1, -2, 2>; + BOOST_TEST_TRAIT_SAME(mp_min_element, mp_int<-2>); + } + + return boost::report_errors(); +} + +#endif diff --git a/test/mp_min_element_q_2.cpp b/test/mp_min_element_q_2.cpp new file mode 100644 index 0000000..c1bb920 --- /dev/null +++ b/test/mp_min_element_q_2.cpp @@ -0,0 +1,61 @@ +// Copyright 2017, 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_min_element_q; + using boost::mp11::mp_less; + using boost::mp11::mp_int; + using boost::mp11::mp_quote; + + using Q = mp_quote; + + { + using L1 = V1<1>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<1>); + + using L2 = V1<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<1>); + + using L3 = V1<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<1>); + + using L4 = V1<-1, 1u, -2, 2u>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<-2>); + } + + { + using L1 = V2<1>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<1>); + + using L2 = V2<2, 4, 3, 1>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<1>); + + using L3 = V2<2, 1, 2, 3>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<1>); + + using L4 = V2<-1, 1, -2, 2>; + BOOST_TEST_TRAIT_SAME(mp_min_element_q, mp_int<-2>); + } + + return boost::report_errors(); +} + +#endif 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(); +} diff --git a/test/mp_slice_2.cpp b/test/mp_slice_2.cpp new file mode 100644 index 0000000..1ac2d73 --- /dev/null +++ b/test/mp_slice_2.cpp @@ -0,0 +1,168 @@ +// 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_list; + using boost::mp11::mp_slice; + using boost::mp11::mp_slice_c; + using boost::mp11::mp_size_t; + + { + using L1 = V1<>; + + BOOST_TEST_TRAIT_SAME(mp_slice_c, L1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<0>>, L1); + + using L2 = V1; + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<0>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<0, true>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<0, true, 1>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<0, true, 1, std::size_t(2)>); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<1>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<1, std::size_t(2)>); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V1<>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<0>>, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<1>>, V1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<2>>, V1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V1); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<1>>, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<2>>, V1<0>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V1<0, true>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V1<0, true, 1>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V1<0, true, 1, std::size_t(2)>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<2>>, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V1); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V1<1>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V1<1, std::size_t(2)>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V1<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V1); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V1<>); + } + + { + using L1 = V2<>; + + BOOST_TEST_TRAIT_SAME(mp_slice_c, L1); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<0>>, L1); + + using L2 = V2<1, 2, 3, 4, 5>; + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<1>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<1, 2>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<1, 2, 3>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<1, 2, 3, 4>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<1, 2, 3, 4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<2>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<2, 3>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<2, 3, 4>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<2, 3, 4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<3>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<3, 4>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<3, 4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<4>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<5>); + + BOOST_TEST_TRAIT_SAME(mp_slice_c, V2<>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<0>>, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<1>>, V2<1>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<2>>, V2<1, 2>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V2<1, 2, 3>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V2<1, 2, 3, 4>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V2<1, 2, 3, 4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<1>>, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<2>>, V2<2>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V2<2, 3>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V2<2, 3, 4>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V2<2, 3, 4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<2>>, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V2<3>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V2<3, 4>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V2<3, 4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<3>>, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V2<4>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V2<4, 5>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<4>>, V2<>); + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V2<5>); + + BOOST_TEST_TRAIT_SAME(mp_slice, mp_size_t<5>>, V2<>); + } + + using boost::mp11::mp_iota_c; + using boost::mp11::mp_rename_v; + + { + using L1 = mp_rename_v, V1>; + using L2 = mp_rename_v, V1>; + + BOOST_TEST_TRAIT_SAME(mp_slice_c, L2); + BOOST_TEST_TRAIT_SAME(mp_slice_c, L1); + } + + return boost::report_errors(); +} + +#endif diff --git a/test/mp_sliding_fold.cpp b/test/mp_sliding_fold.cpp new file mode 100644 index 0000000..ba6ee2b --- /dev/null +++ b/test/mp_sliding_fold.cpp @@ -0,0 +1,113 @@ +// 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 +#include + +struct X1 {}; +struct X2 {}; +struct X3 {}; +struct X4 {}; +struct X5 {}; + +using boost::mp11::mp_plus; +using boost::mp11::mp_int; + +#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +template using average = mp_int::value / sizeof...(C)>; + +#else + +template struct average_impl: mp_int::value / sizeof...(C)> {}; +template using average = typename average_impl::type; + +#endif + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_list_c; + using boost::mp11::mp_size_t; + using boost::mp11::mp_sliding_fold; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_list>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_list>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_list>, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_list>, mp_list, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_list>, mp_list, mp_list, mp_list, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_list>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_list>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_list>, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_list>, mp_list, mp_list, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_list>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_list>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_list>, mp_list, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_list>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_list>, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_list>, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_list>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_list>, mp_list<>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, mp_list, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, mp_list, std::pair, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, mp_list, std::pair, std::pair, std::pair>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, std::tuple, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, std::tuple, std::pair, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, std::pair>, std::tuple, std::pair, std::pair, std::pair>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_plus>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_plus>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_plus>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_plus>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_plus>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_plus>, mp_list_c>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, average>, mp_list_c>)); + + return boost::report_errors(); +} diff --git a/test/mp_sliding_fold_q.cpp b/test/mp_sliding_fold_q.cpp new file mode 100644 index 0000000..87794c9 --- /dev/null +++ b/test/mp_sliding_fold_q.cpp @@ -0,0 +1,121 @@ +// 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 +#include + +struct X1 {}; +struct X2 {}; +struct X3 {}; +struct X4 {}; +struct X5 {}; + +using boost::mp11::mp_plus; +using boost::mp11::mp_int; + +#if !BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) + +struct average +{ + template using fn = mp_int::value / sizeof...(C)>; +}; + +#else + +template struct average_impl: mp_int::value / sizeof...(C)> {}; + +struct average +{ + template using fn = typename average_impl::type; +}; + +#endif + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_list_c; + using boost::mp11::mp_quote; + using boost::mp11::mp_size_t; + using boost::mp11::mp_sliding_fold_q; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_quote>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_quote>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_quote>, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_quote>, mp_list, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_quote>, mp_list, mp_list, mp_list, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list, mp_list, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_quote>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_quote>, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_quote>, mp_list, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_quote>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_quote>, mp_list, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_quote>, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_quote>, mp_list<>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list, std::pair, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list, std::pair, std::pair, std::pair>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, std::tuple<>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, std::tuple, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, std::tuple, std::pair, std::pair>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, std::tuple, std::pair, std::pair, std::pair>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, mp_quote>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_quote>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, mp_quote>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, mp_quote>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, mp_quote>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, mp_quote>, mp_list_c>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<1>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<3>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<4>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<5>, average>, mp_list_c>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<6>, average>, mp_list_c>)); + + return boost::report_errors(); +} diff --git a/test/mp_transform_2.cpp b/test/mp_transform_2.cpp new file mode 100644 index 0000000..dc6f305 --- /dev/null +++ b/test/mp_transform_2.cpp @@ -0,0 +1,45 @@ +// 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 + +template struct V1 {}; +template struct V2 {}; + +int main() +{ + using boost::mp11::mp_transform; + using boost::mp11::mp_identity_t; + using boost::mp11::mp_plus; + + using L1 = V1; + using L2 = V2<1, -2, 3, -4>; + + BOOST_TEST_TRAIT_SAME(mp_transform, L1); + + BOOST_TEST_TRAIT_SAME(mp_transform, V1<1, -2, 3U, -4L>); + BOOST_TEST_TRAIT_SAME(mp_transform, V1<2, -4, 6U, -8L>); + BOOST_TEST_TRAIT_SAME(mp_transform, V1<3, -6, 9U, -12L>); + + BOOST_TEST_TRAIT_SAME(mp_transform, L2); + + BOOST_TEST_TRAIT_SAME(mp_transform, V2<1, -2, 3, -4>); + BOOST_TEST_TRAIT_SAME(mp_transform, V2<2, -4, 6, -8>); + BOOST_TEST_TRAIT_SAME(mp_transform, V2<3, -6, 9, -12>); + + // + + return boost::report_errors(); +} + +#endif diff --git a/test/mp_transform_q_2.cpp b/test/mp_transform_q_2.cpp new file mode 100644 index 0000000..bacf24d --- /dev/null +++ b/test/mp_transform_q_2.cpp @@ -0,0 +1,67 @@ +// Copyright 2023 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 Test +{ + void operator()( boost::mp11::mp_size_t<0> ) + { + } + + template void operator()( N ) + { + using boost::mp11::mp_repeat; + using boost::mp11::mp_list; + using boost::mp11::mp_apply_q; + using boost::mp11::mp_bind_front; + using boost::mp11::mp_transform_q; + using boost::mp11::mp_quote; + + using L1 = mp_repeat< mp_list>, N >; // mp_list, pair, ...> + using L2 = mp_apply_q< mp_bind_front>, L1>; // pair, mp_list> + + using R1 = mp_repeat, N>; // mp_list + using R2 = mp_repeat, N>; // mp_list + + BOOST_TEST_TRAIT_SAME(L2, std::pair); + } +}; + +int main() +{ +#if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, < 1920 ) + + using boost::mp11::mp_size_t; + + Test()( mp_size_t<1>() ); + Test()( mp_size_t<2>() ); + Test()( mp_size_t<3>() ); + Test()( mp_size_t<4>() ); + Test()( mp_size_t<5>() ); + Test()( mp_size_t<6>() ); + Test()( mp_size_t<7>() ); + Test()( mp_size_t<9>() ); + Test()( mp_size_t<10>() ); + Test()( mp_size_t<11>() ); + +#else + + using boost::mp11::mp_for_each; + using boost::mp11::mp_iota_c; + + mp_for_each< mp_iota_c<32> >( Test() ); + +#endif + + return boost::report_errors(); +}