diff --git a/include/boost/mp11/detail/mp_append.hpp b/include/boost/mp11/detail/mp_append.hpp index 8a8f4d5..937d15e 100644 --- a/include/boost/mp11/detail/mp_append.hpp +++ b/include/boost/mp11/detail/mp_append.hpp @@ -26,6 +26,10 @@ template struct mp_append_impl; #if BOOST_MP11_WORKAROUND( BOOST_MP11_MSVC, <= 1800 ) +template struct mp_append_impl +{ +}; + template<> struct mp_append_impl<> { using type = mp_list<>; @@ -36,14 +40,31 @@ template class L, class... T> struct mp_append_impl> using type = L; }; -template class L1, class... T1, template class L2, class... T2, class... Lr> struct mp_append_impl, L2, Lr...> +template class L1, class... T1, template class L2, class... T2> struct mp_append_impl, L2> { - using type = typename mp_append_impl, Lr...>::type; + using type = L1; +}; + +template class L1, class... T1, template class L2, class... T2, template class L3, class... T3> struct mp_append_impl, L2, L3> +{ + using type = L1; +}; + +template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4> struct mp_append_impl, L2, L3, L4> +{ + using type = L1; +}; + +template class L1, class... T1, template class L2, class... T2, template class L3, class... T3, template class L4, class... T4, template class L5, class... T5, class... Lr> struct mp_append_impl, L2, L3, L4, L5, Lr...> +{ + using type = typename mp_append_impl, Lr...>::type; }; #else -template, class L2 = mp_list<>, class L3 = mp_list<>, class L4 = mp_list<>, class L5 = mp_list<>, class L6 = mp_list<>, class L7 = mp_list<>, class L8 = mp_list<>, class L9 = mp_list<>, class L10 = mp_list<>, class L11 = mp_list<>> struct append_11_impl; +template, class L2 = mp_list<>, class L3 = mp_list<>, class L4 = mp_list<>, class L5 = mp_list<>, class L6 = mp_list<>, class L7 = mp_list<>, class L8 = mp_list<>, class L9 = mp_list<>, class L10 = mp_list<>, class L11 = mp_list<>> struct append_11_impl +{ +}; template< template class L1, class... T1, diff --git a/test/Jamfile b/test/Jamfile index 5c9d59a..d385068 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -26,6 +26,7 @@ run mp_push_back.cpp ; run mp_rename.cpp ; run mp_append.cpp ; run mp_append_2.cpp ; +run mp_append_sf.cpp ; run mp_replace_front.cpp ; run mp_replace_second.cpp ; run mp_replace_third.cpp ; diff --git a/test/mp_append.cpp b/test/mp_append.cpp index 25482c4..264359a 100644 --- a/test/mp_append.cpp +++ b/test/mp_append.cpp @@ -1,5 +1,5 @@ -// Copyright 2015 Peter Dimov. +// Copyright 2015 Peter Dimov. // // Distributed under the Boost Software License, Version 1.0. // diff --git a/test/mp_append_sf.cpp b/test/mp_append_sf.cpp new file mode 100644 index 0000000..80c417c --- /dev/null +++ b/test/mp_append_sf.cpp @@ -0,0 +1,32 @@ + +// Copyright 2019 Peter Dimov. +// +// 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 + +int main() +{ + using boost::mp11::mp_append; + using boost::mp11::mp_valid; + using boost::mp11::mp_list; + + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + BOOST_TEST_TRAIT_FALSE((mp_valid)); + + BOOST_TEST_TRAIT_FALSE((mp_valid, void>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_list<>, void>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_list<>, mp_list<>, void>)); + BOOST_TEST_TRAIT_FALSE((mp_valid, mp_list<>, mp_list<>, mp_list<>, void>)); + + return boost::report_errors(); +}