diff --git a/include/boost/mp11/list.hpp b/include/boost/mp11/list.hpp index 7d2053a..b5daed3 100644 --- a/include/boost/mp11/list.hpp +++ b/include/boost/mp11/list.hpp @@ -69,13 +69,35 @@ template using mp_empty = mp_bool< mp_size::value == 0 >; namespace detail { -template struct mp_assign_impl; +template struct mp_assign_impl +{ +// An error "no type named 'type'" here means that the arguments to mp_assign aren't lists +}; template class L1, class... T, template class L2, class... U> struct mp_assign_impl, L2> { using type = L1; }; +#if defined(BOOST_MP11_HAS_TEMPLATE_AUTO) + +template class L1, auto... A, template class L2, class... U> struct mp_assign_impl, L2> +{ + using type = L1; +}; + +template class L1, class... T, template class L2, auto... B> struct mp_assign_impl, L2> +{ + using type = L1...>; +}; + +template class L1, auto... A, template class L2, auto... B> struct mp_assign_impl, L2> +{ + using type = L1; +}; + +#endif + } // namespace detail template using mp_assign = typename detail::mp_assign_impl::type; diff --git a/test/Jamfile b/test/Jamfile index 2ea2f61..21fb57a 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -29,6 +29,10 @@ run mp_size.cpp ; run mp_size_2.cpp ; run mp_empty.cpp ; run mp_empty_2.cpp ; +run mp_assign.cpp ; +run mp_assign_2.cpp ; +run mp_clear.cpp ; +run mp_clear_2.cpp ; run mp_front.cpp ; run mp_pop_front.cpp ; run mp_second.cpp ; @@ -54,8 +58,6 @@ run mp_list_v.cpp ; run mp_rename_v.cpp ; # algorithm -run mp_assign.cpp ; -run mp_clear.cpp ; run mp_transform.cpp ; run mp_transform_q.cpp ; run mp_transform_sf.cpp ; diff --git a/test/mp_assign_2.cpp b/test/mp_assign_2.cpp new file mode 100644 index 0000000..be35898 --- /dev/null +++ b/test/mp_assign_2.cpp @@ -0,0 +1,89 @@ +// 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 +#include + +template struct L1 {}; +template struct L2 {}; + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_list_v; + using boost::mp11::mp_assign; + using boost::mp11::mp_false; + using boost::mp11::mp_true; + using boost::mp11::mp_int; + + // + + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v<>>, L1<>); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, L1); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, L1); + + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v<>>, L1<>); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, L1); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, L1); + + // + + BOOST_TEST_TRAIT_SAME(mp_assign, L2<>>, L1<>); + BOOST_TEST_TRAIT_SAME(mp_assign, L2<0>>, L1<0>); + BOOST_TEST_TRAIT_SAME(mp_assign, L2<0, 1>>, L1<0, 1>); + + BOOST_TEST_TRAIT_SAME(mp_assign, L2<>>, L1<>); + BOOST_TEST_TRAIT_SAME(mp_assign, L2<0>>, L1<0>); + BOOST_TEST_TRAIT_SAME(mp_assign, L2<0, 1>>, L1<0, 1>); + + // + + BOOST_TEST_TRAIT_SAME(mp_assign, L1<>>, L2<>); + BOOST_TEST_TRAIT_SAME(mp_assign, L1<0>>, L2<0>); + BOOST_TEST_TRAIT_SAME(mp_assign, L1<0, 1>>, L2<0, 1>); + + BOOST_TEST_TRAIT_SAME(mp_assign, L1<>>, L2<>); + BOOST_TEST_TRAIT_SAME(mp_assign, L1<0>>, L2<0>); + BOOST_TEST_TRAIT_SAME(mp_assign, L1<0, 1>>, L2<0, 1>); + + // + + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v<>>, mp_list<>); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, mp_list); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, mp_list>); + + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v<>>, mp_list<>); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, mp_list); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, mp_list>); + + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list_v>, std::pair>); + + // + + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list<>>, mp_list_v<>); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list>, mp_list_v); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list>>, mp_list_v); + + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list<>>, mp_list_v<>); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list>, mp_list_v); + BOOST_TEST_TRAIT_SAME(mp_assign, mp_list>>, mp_list_v); + + BOOST_TEST_TRAIT_SAME(mp_assign, std::pair>>, mp_list_v); + + // + + return boost::report_errors(); +} + +#endif diff --git a/test/mp_clear_2.cpp b/test/mp_clear_2.cpp new file mode 100644 index 0000000..2c5853d --- /dev/null +++ b/test/mp_clear_2.cpp @@ -0,0 +1,32 @@ +// 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_clear; + + BOOST_TEST_TRAIT_SAME(mp_clear>, mp_list_v<>); + BOOST_TEST_TRAIT_SAME(mp_clear>, L1<>); + BOOST_TEST_TRAIT_SAME(mp_clear>, L2<>); + + return boost::report_errors(); +} + +#endif