diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index b40dfd9..61c8669 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -84,6 +84,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...>; diff --git a/test/Jamfile b/test/Jamfile index 4522892..1d8252d 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -73,6 +73,7 @@ run mp_is_value_list.cpp ; # algorithm run mp_transform.cpp ; +run mp_transform_2.cpp ; run mp_transform_q.cpp ; run mp_transform_q_2.cpp ; run mp_transform_sf.cpp ; 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