using _f = mp_if, W, T>;
+template class P, class W> struct mp_replace_if_impl;
- using type = mp_transform<_f, L>;
+template class L, class... T, template class P, class W> struct mp_replace_if_impl, P, W>
+{
+ template using _f = mp_if, W, U>;
+ using type = L<_f...>;
};
} // namespace detail
@@ -384,27 +363,15 @@ namespace detail
template class P> struct mp_copy_if_impl;
-#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 )
-
template class L, class... T, template class P> struct mp_copy_if_impl, P>
{
- static_assert( sizeof...(T) == 0, "T... must be empty" );
- using type = L<>;
-};
-
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 )
+ template struct _f { using type = mp_if, mp_list, mp_list<>>; };
+ using type = mp_append, typename _f::type...>;
#else
-
-template class L, template class P> struct mp_copy_if_impl, P>
-{
- using type = L<>;
-};
-
+ template using _f = mp_if, mp_list, mp_list<>>;
+ using type = mp_append, _f...>;
#endif
-
-template class L, class T1, class... T, template class P> struct mp_copy_if_impl, P>
-{
- using rest = typename mp_copy_if_impl, P>::type;
- using type = mp_if, mp_push_front, rest>;
};
} // namespace detail
@@ -417,32 +384,15 @@ namespace detail
template struct mp_remove_impl;
-#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 )
-
template class L, class... T, class V> struct mp_remove_impl, V>
{
- static_assert( sizeof...(T) == 0, "T... must be empty" );
- using type = L<>;
-};
-
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 )
+ template struct _f { using type = mp_if, mp_list<>, mp_list>; };
+ using type = mp_append, typename _f::type...>;
#else
-
-template class L, class V> struct mp_remove_impl, V>
-{
- using type = L<>;
-};
-
+ template using _f = mp_if, mp_list<>, mp_list>;
+ using type = mp_append, _f...>;
#endif
-
-template class L, class T1, class... T> struct mp_remove_impl, T1>
-{
- using type = typename mp_remove_impl, T1>::type;
-};
-
-template class L, class T1, class... T, class V> struct mp_remove_impl, V>
-{
- using rest = typename mp_remove_impl, V>::type;
- using type = mp_push_front;
};
} // namespace detail
@@ -455,27 +405,15 @@ namespace detail
template class P> struct mp_remove_if_impl;
-#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 )
-
template class L, class... T, template class P> struct mp_remove_if_impl, P>
{
- static_assert( sizeof...(T) == 0, "T... must be empty" );
- using type = L<>;
-};
-
+#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1910 )
+ template struct _f { using type = mp_if, mp_list<>, mp_list>; };
+ using type = mp_append, typename _f::type...>;
#else
-
-template class L, template class P> struct mp_remove_if_impl, P>
-{
- using type = L<>;
-};
-
+ template using _f = mp_if, mp_list<>, mp_list>;
+ using type = mp_append, _f...>;
#endif
-
-template class L, class T1, class... T, template class P> struct mp_remove_if_impl, P>
-{
- using rest = typename mp_remove_if_impl, P>::type;
- using type = mp_if, rest, mp_push_front>;
};
} // namespace detail
@@ -488,27 +426,9 @@ namespace detail
template class P> struct mp_partition_impl;
-#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 )
-
template class L, class... T, template class P> struct mp_partition_impl, P>
{
- static_assert( sizeof...(T) == 0, "T... must be empty" );
- using type = L, L<>>;
-};
-
-#else
-
-template class L, template class P> struct mp_partition_impl, P>
-{
- using type = L, L<>>;
-};
-
-#endif
-
-template class L, class T1, class... T, template class P> struct mp_partition_impl, P>
-{
- using rest = typename mp_partition_impl, P>::type;
- using type = mp_if, L, T1>, mp_second>, L, mp_push_front, T1>>>;
+ using type = L, P>, mp_remove_if, P>>;
};
} // namespace detail
@@ -760,9 +680,29 @@ template class L, class T1, class T2, class T3, class T4, cla
using type = L;
};
-template class L, class T1, class T2, class T3, class T4, class T5, class T6, class... T> struct mp_reverse_impl>
+template class L, class T1, class T2, class T3, class T4, class T5, class T6> struct mp_reverse_impl>
{
- using type = mp_push_back>::type, T6, T5, T4, T3, T2, T1>;
+ using type = L;
+};
+
+template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7> struct mp_reverse_impl>
+{
+ using type = L;
+};
+
+template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8> struct mp_reverse_impl>
+{
+ using type = L;
+};
+
+template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9> struct mp_reverse_impl>
+{
+ using type = L;
+};
+
+template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T> struct mp_reverse_impl>
+{
+ using type = mp_push_back>::type, T10, T9, T8, T7, T6, T5, T4, T3, T2, T1>;
};
} // namespace detail
@@ -797,6 +737,11 @@ template class L, class T1, class... T, class V, template, F, F>::type;
};
+template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, class V, template class F> struct mp_fold_impl, V, F>
+{
+ using type = typename mp_fold_impl, F, T2>, T3>, T4>, T5>, T6>, T7>, T8>, T9>, T10>, F>::type;
+};
+
} // namespace detail
template class F> using mp_fold = typename detail::mp_fold_impl::type;
@@ -830,6 +775,12 @@ template class L, class T1, class... T, class V, template;
};
+template class L, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class T10, class... T, class V, template class F> struct mp_reverse_fold_impl, V, F>
+{
+ using rest = typename mp_reverse_fold_impl, V, F>::type;
+ using type = F>>>>>>>>>;
+};
+
} // namespace detail
template class F> using mp_reverse_fold = typename detail::mp_reverse_fold_impl::type;
diff --git a/include/boost/mp11/list.hpp b/include/boost/mp11/list.hpp
index db57d65..85e590f 100644
--- a/include/boost/mp11/list.hpp
+++ b/include/boost/mp11/list.hpp
@@ -147,6 +147,8 @@ template class A, class... T, template class B> str
template class B> using mp_rename = typename detail::mp_rename_impl::type;
+template class F, class L> using mp_apply = typename detail::mp_rename_impl::type;
+
// mp_append
namespace detail
{
diff --git a/test/mp_copy_if.cpp b/test/mp_copy_if.cpp
index 1545c18..0cf54d4 100644
--- a/test/mp_copy_if.cpp
+++ b/test/mp_copy_if.cpp
@@ -1,5 +1,5 @@
-// Copyright 2015 Peter Dimov.
+// Copyright 2015-2017 Peter Dimov.
//
// Distributed under the Boost Software License, Version 1.0.
//
@@ -9,6 +9,7 @@
#include
#include
+#include
#include
#include
#include
@@ -17,6 +18,10 @@ struct X1 {};
struct X2 {};
struct X3 {};
+using boost::mp11::mp_bool;
+
+template using is_even = mp_bool;
+
int main()
{
using boost::mp11::mp_list;
@@ -46,5 +51,17 @@ int main()
BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>));
}
+ using boost::mp11::mp_iota_c;
+ using boost::mp11::mp_size_t;
+
+ {
+ int const N = 12;
+ using L1 = mp_iota_c;
+
+ using R1 = mp_copy_if;
+
+ BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_size_t<4>, mp_size_t<6>, mp_size_t<8>, mp_size_t<10>>>));
+ }
+
return boost::report_errors();
}
diff --git a/test/mp_fold.cpp b/test/mp_fold.cpp
index 4a0fa73..96dd7ba 100644
--- a/test/mp_fold.cpp
+++ b/test/mp_fold.cpp
@@ -9,6 +9,7 @@
#include
#include
+#include
#include
#include
#include
@@ -53,5 +54,25 @@ int main()
BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>, mp_push_front>, mp_list>));
}
+ using boost::mp11::mp_iota_c;
+ using boost::mp11::mp_reverse;
+ using boost::mp11::mp_size_t;
+ using boost::mp11::mp_plus;
+
+ {
+ int const N = 37;
+
+ using L = mp_iota_c;
+
+ using R1 = mp_fold, mp_push_back>;
+ BOOST_TEST_TRAIT_TRUE((std::is_same));
+
+ using R2 = mp_fold, mp_push_front>;
+ BOOST_TEST_TRAIT_TRUE((std::is_same>));
+
+ using R3 = mp_fold, mp_plus>;
+ BOOST_TEST_TRAIT_TRUE((std::is_same>));
+ }
+
return boost::report_errors();
}
diff --git a/test/mp_remove_if.cpp b/test/mp_remove_if.cpp
index 733f9fb..bd9b777 100644
--- a/test/mp_remove_if.cpp
+++ b/test/mp_remove_if.cpp
@@ -1,5 +1,5 @@
-// Copyright 2015 Peter Dimov.
+// Copyright 2015-2017 Peter Dimov.
//
// Distributed under the Boost Software License, Version 1.0.
//
@@ -9,6 +9,7 @@
#include
#include
+#include
#include
#include
#include
@@ -17,6 +18,10 @@ struct X1 {};
struct X2 {};
struct X3 {};
+using boost::mp11::mp_bool;
+
+template using is_odd = mp_bool;
+
int main()
{
using boost::mp11::mp_list;
@@ -46,5 +51,17 @@ int main()
BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>));
}
+ using boost::mp11::mp_iota_c;
+ using boost::mp11::mp_size_t;
+
+ {
+ int const N = 12;
+ using L1 = mp_iota_c;
+
+ using R1 = mp_remove_if;
+
+ BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<2>, mp_size_t<4>, mp_size_t<6>, mp_size_t<8>, mp_size_t<10>>>));
+ }
+
return boost::report_errors();
}
diff --git a/test/mp_rename.cpp b/test/mp_rename.cpp
index e124683..3ad751a 100644
--- a/test/mp_rename.cpp
+++ b/test/mp_rename.cpp
@@ -1,5 +1,5 @@
-// Copyright 2015 Peter Dimov.
+// Copyright 2015-2017 Peter Dimov.
//
// Distributed under the Boost Software License, Version 1.0.
//
@@ -20,68 +20,126 @@ int main()
{
using boost::mp11::mp_list;
using boost::mp11::mp_rename;
+ using boost::mp11::mp_apply;
using L1 = mp_list<>;
+
BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>>));
BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>));
BOOST_TEST_TRAIT_TRUE((std::is_same, X<>>));
BOOST_TEST_TRAIT_TRUE((std::is_same, Y<>>));
+ BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>>));
+ BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple<>>));
+ BOOST_TEST_TRAIT_TRUE((std::is_same, X<>>));
+ BOOST_TEST_TRAIT_TRUE((std::is_same, Y<>>));
+
using L2 = mp_list;
+
BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>));
BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>));
BOOST_TEST_TRAIT_TRUE((std::is_same, X>));
BOOST_TEST_TRAIT_TRUE((std::is_same, Y>));
+ BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>));
+ BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>));
+ BOOST_TEST_TRAIT_TRUE((std::is_same, X