diff --git a/include/boost/mp11/list.hpp b/include/boost/mp11/list.hpp index c5e89c9..7d2053a 100644 --- a/include/boost/mp11/list.hpp +++ b/include/boost/mp11/list.hpp @@ -1,7 +1,7 @@ #ifndef BOOST_MP11_LIST_HPP_INCLUDED #define BOOST_MP11_LIST_HPP_INCLUDED -// Copyright 2015-2017 Peter Dimov. +// Copyright 2015-2023 Peter Dimov. // // Distributed under the Boost Software License, Version 1.0. // @@ -190,6 +190,33 @@ template using mp_push_back = typename detail::mp_push_back // mp_apply_q // in detail/mp_rename.hpp +// mp_rename_v +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +namespace detail +{ + +template class B> struct mp_rename_v_impl +{ +// An error "no type named 'type'" here means that the first argument to mp_rename_v is not a list +}; + +template class L, class... T, template class B> struct mp_rename_v_impl, B> +{ + using type = B; +}; + +template class L, auto... A, template class B> struct mp_rename_v_impl, B> +{ + using type = B; +}; + +} // namespace detail + +template class B> using mp_rename_v = typename detail::mp_rename_v_impl::type; + +#endif + // mp_replace_front namespace detail { diff --git a/test/Jamfile b/test/Jamfile index f46ceb6..2ea2f61 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -51,6 +51,7 @@ run mp_transform_front.cpp ; run mp_transform_second.cpp ; run mp_transform_third.cpp ; run mp_list_v.cpp ; +run mp_rename_v.cpp ; # algorithm run mp_assign.cpp ; diff --git a/test/mp_rename_v.cpp b/test/mp_rename_v.cpp new file mode 100644 index 0000000..13103ae --- /dev/null +++ b/test/mp_rename_v.cpp @@ -0,0 +1,56 @@ +// Copyright 2023 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#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 +#include + +template struct L1 {}; +template struct L2 {}; + +int main() +{ + using boost::mp11::mp_list_v; + using boost::mp11::mp_rename_v; + using boost::mp11::mp_list_c; + using boost::mp11::mp_rename; + using boost::mp11::mp_list; + + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v<>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v); + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v<0>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v); + + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v); + + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v<>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v<0>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v<0, 1>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v>, mp_list_v<0, 1, 2>); + + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<0>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<0, 1>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<0, 1, 2>); + + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<0>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<0, 1>); + BOOST_TEST_TRAIT_SAME(mp_rename_v, L2>, L2<0, 1, 2>); + + using L3 = mp_rename, mp_list>; + BOOST_TEST_TRAIT_SAME(mp_rename_v, mp_list_v); + + return boost::report_errors(); +} + +#endif