diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 5edfaac..0f68974 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -66,17 +66,47 @@ template class F, class... L> struct mp_transform_impl template class F, template class L, class... T> struct mp_transform_impl> { +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) + + template struct f { using type = F; }; + + using type = L::type...>; + +#else + using type = L...>; + +#endif }; template class F, template class L1, class... T1, template class L2, class... T2> struct mp_transform_impl, L2> { +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) + + template struct f { using type = F; }; + + using type = L1::type...>; + +#else + using type = L1...>; + +#endif }; template class F, template class L1, class... T1, template class L2, class... T2, template class L3, class... T3> struct mp_transform_impl, L2, L3> { +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) + + template struct f { using type = F; }; + + using type = L1::type...>; + +#else + using type = L1...>; + +#endif }; #if BOOST_WORKAROUND( BOOST_MSVC, == 1900 ) || BOOST_WORKAROUND( BOOST_GCC, < 40800 ) @@ -129,7 +159,7 @@ template class P, template class F, class... L> str using Qp = mp_quote

; using Qf = mp_quote; -#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) template struct _f_ { using type = mp_eval_if_q>, mp_first>, Qf, U...>; }; template using _f = typename _f_::type; diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 362df65..2d6df0a 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -35,6 +35,7 @@ run mp_apply_q.cpp : : : $(REQ) ; run mp_assign.cpp : : : $(REQ) ; run mp_clear.cpp : : : $(REQ) ; run mp_transform.cpp : : : $(REQ) ; +run mp_transform_q.cpp : : : $(REQ) ; run mp_transform_sf.cpp : : : $(REQ) ; run mp_transform_if.cpp : : : $(REQ) ; run mp_transform_if_q.cpp : : : $(REQ) ; diff --git a/test/mp_transform_q.cpp b/test/mp_transform_q.cpp new file mode 100644 index 0000000..6c73cb1 --- /dev/null +++ b/test/mp_transform_q.cpp @@ -0,0 +1,114 @@ + +// Copyright 2015 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 +#include +#include +#include +#include + +struct X1 {}; +struct X2 {}; +struct X3 {}; +struct X4 {}; + +struct Y1 {}; +struct Y2 {}; +struct Y3 {}; +struct Y4 {}; + +struct Z1 {}; +struct Z2 {}; +struct Z3 {}; +struct Z4 {}; + +struct U1 {}; +struct U2 {}; + +struct V1 {}; +struct V2 {}; + +struct W1 {}; +struct W2 {}; + +using boost::mp11::mp_quote; +using boost::mp11::mp_list; + +template using add_pointer = typename std::add_pointer::type; +using Q_add_pointer = mp_quote; + +template using is_same = typename std::is_same::type; +using Q_is_same = mp_quote; + +using Q_mp_list = mp_quote; +using Q_std_tuple = mp_quote; +using Q_std_pair = mp_quote; + +int main() +{ + using boost::mp11::mp_transform_q; + + using L1 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, std::tuple, std::tuple, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + + using L2 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, std::tuple, std::tuple, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, std::pair, std::pair, std::pair>>)); + + using L3 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, mp_list, mp_list, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list, std::tuple, std::tuple, std::tuple>>)); + + // + + using L4 = std::tuple; + + 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>)); + + // + + using L5 = std::pair; + using L6 = std::pair; + using L7 = std::pair; + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, mp_list>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, mp_list>>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair>)); + + // + + using L8 = std::pair; + using L9 = std::pair; + using L10 = std::pair; + using L11 = std::pair; + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, std::tuple>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::pair, std::tuple>>)); + + // + + return boost::report_errors(); +}