diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index b079624..b0c2450 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -9,6 +9,7 @@ // http://www.boost.org/LICENSE_1_0.txt #include +#include #include #include #include @@ -387,6 +388,44 @@ template class L, class T1, class... T, template cl template class P> using mp_copy_if = typename detail::mp_copy_if_impl::type; +// mp_remove +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<>; +}; + +#else + +template class L, class V> struct mp_remove_impl, V> +{ + using type = L<>; +}; + +#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 + +template using mp_remove = typename detail::mp_remove_impl::type; + // mp_remove_if namespace detail { @@ -619,10 +658,145 @@ template using mp_find = mp_drop>; template class P> using mp_find_if = mp_drop>; // mp_reverse +namespace detail +{ + +template struct mp_reverse_impl; + +#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) + +template class L, class... T> struct mp_reverse_impl> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = L<>; +}; + +#else + +template class L> struct mp_reverse_impl> +{ + using type = L<>; +}; + +#endif + +template class L, class T1> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5> struct mp_reverse_impl> +{ + using type = L; +}; + +template class L, class T1, class T2, class T3, class T4, class T5, class T6, class... T> struct mp_reverse_impl> +{ + using type = mp_push_back>::type, T6, T5, T4, T3, T2, T1>; +}; + +} // namespace detail + +template using mp_reverse = typename detail::mp_reverse_impl::type; + // mp_fold +namespace detail +{ + +template class F> struct mp_fold_impl; + +#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) + +template class L, class... T, class V, template class F> struct mp_fold_impl, V, F> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = V; +}; + +#else + +template class L, class V, template class F> struct mp_fold_impl, V, F> +{ + using type = V; +}; + +#endif + +template class L, class T1, class... T, class V, template class F> struct mp_fold_impl, V, F> +{ + using type = typename mp_fold_impl, F, F>::type; +}; + +} // namespace detail + +template class F> using mp_fold = typename detail::mp_fold_impl::type; + // mp_reverse_fold +namespace detail +{ + +template class F> struct mp_reverse_fold_impl; + +#if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, <= 1800 ) + +template class L, class... T, class V, template class F> struct mp_reverse_fold_impl, V, F> +{ + static_assert( sizeof...(T) == 0, "T... must be empty" ); + using type = V; +}; + +#else + +template class L, class V, template class F> struct mp_reverse_fold_impl, V, F> +{ + using type = V; +}; + +#endif + +template class L, class T1, 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; + // mp_unique -// mp_remove +namespace detail +{ + +template struct mp_unique_impl; + +template class L, class... T> struct mp_unique_impl> +{ + using type = mp_set_push_back, T...>; +}; + +} // namespace detail + +template using mp_unique = typename detail::mp_unique_impl::type; + +// mp_all_of +// mp_none_of +// mp_any_of } // namespace boost diff --git a/include/boost/mp11/set.hpp b/include/boost/mp11/set.hpp index faed816..568273a 100644 --- a/include/boost/mp11/set.hpp +++ b/include/boost/mp11/set.hpp @@ -8,12 +8,73 @@ // See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt +#include +#include + namespace boost { -// mp_set_contains +// mp_set_contains +namespace detail +{ + +template struct mp_set_contains_impl; + +template class L, class... T, class V> struct mp_set_contains_impl, V> +{ + using type = mp_to_bool, mp_inherit...>>>; +}; + +} // namespace detail + +template using mp_set_contains = typename detail::mp_set_contains_impl::type; + // mp_set_push_back +namespace detail +{ + +template struct mp_set_push_back_impl; + +template class L, class... U> struct mp_set_push_back_impl> +{ + using type = L; +}; + +template class L, class... U, class T1, class... T> struct mp_set_push_back_impl, T1, T...> +{ + using S = mp_if, T1>, L, L>; + using type = typename mp_set_push_back_impl::type; +}; + +} // namespace detail + +template using mp_set_push_back = typename detail::mp_set_push_back_impl::type; + // mp_set_push_front +namespace detail +{ + +template struct mp_set_push_front_impl; + +template class L, class... U> struct mp_set_push_front_impl> +{ + using type = L; +}; + +template class L, class... U, class T1> struct mp_set_push_front_impl, T1> +{ + using type = mp_if, T1>, L, L>; +}; + +template class L, class... U, class T1, class... T> struct mp_set_push_front_impl, T1, T...> +{ + using S = typename mp_set_push_front_impl, T...>::type; + using type = typename mp_set_push_front_impl::type; +}; + +} // namespace detail + +template using mp_set_push_front = typename detail::mp_set_push_front_impl::type; } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index dfff4fe..677dc14 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -25,6 +25,8 @@ run mp_push_front.cpp : : : $(REQ) ; run mp_push_back.cpp : : : $(REQ) ; run mp_rename.cpp : : : $(REQ) ; run mp_append.cpp : : : $(REQ) ; + +# algorithm run mp_assign.cpp : : : $(REQ) ; run mp_clear.cpp : : : $(REQ) ; run mp_transform.cpp : : : $(REQ) ; @@ -41,6 +43,7 @@ run mp_take.cpp : : : $(REQ) ; run mp_replace.cpp : : : $(REQ) ; run mp_replace_if.cpp : : : $(REQ) ; run mp_copy_if.cpp : : : $(REQ) ; +run mp_remove.cpp : : : $(REQ) ; run mp_remove_if.cpp : : : $(REQ) ; run mp_partition.cpp : : : $(REQ) ; run mp_sort.cpp : : : $(REQ) ; @@ -48,6 +51,10 @@ run mp_find_index.cpp : : : $(REQ) ; run mp_find_index_if.cpp : : : $(REQ) ; run mp_find.cpp : : : $(REQ) ; run mp_find_if.cpp : : : $(REQ) ; +run mp_reverse.cpp : : : $(REQ) ; +run mp_fold.cpp : : : $(REQ) ; +run mp_reverse_fold.cpp : : : $(REQ) ; +run mp_unique.cpp : : : $(REQ) ; # integral run integral.cpp : : : $(REQ) ; @@ -67,3 +74,8 @@ run integer_sequence.cpp : : : $(REQ) ; # tuple_for_each run tuple_for_each.cpp : : : $(REQ) ; run tuple_for_each_cx.cpp : : : $(REQ) ; + +# set +run mp_set_contains.cpp : : : $(REQ) ; +run mp_set_push_back.cpp : : : $(REQ) ; +run mp_set_push_front.cpp : : : $(REQ) ; diff --git a/test/mp_fold.cpp b/test/mp_fold.cpp new file mode 100644 index 0000000..eb5070a --- /dev/null +++ b/test/mp_fold.cpp @@ -0,0 +1,57 @@ + +// 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 + +struct X1 {}; +struct X2 {}; +struct X3 {}; +struct X4 {}; + +template struct F {}; + +int main() +{ + using boost::mp_list; + using boost::mp_fold; + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, void>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F, X2>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F, X2>, X3>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F, X2>, X3>, X4>>)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, void>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F, X2>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F, X2>, X3>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F, X2>, X3>, X4>>)); + } + + using boost::mp_push_back; + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>, mp_push_back>, mp_list>)); + } + + using boost::mp_push_front; + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>, mp_push_front>, mp_list>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_remove.cpp b/test/mp_remove.cpp new file mode 100644 index 0000000..8daff77 --- /dev/null +++ b/test/mp_remove.cpp @@ -0,0 +1,52 @@ + +// 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 + +struct X1 {}; +struct X2 {}; +struct X3 {}; + +int main() +{ + using boost::mp_list; + using boost::mp_remove; + + { + using L1 = mp_list<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + + using L2 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + 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 L1 = std::tuple<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + + using L2 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_reverse.cpp b/test/mp_reverse.cpp new file mode 100644 index 0000000..740716c --- /dev/null +++ b/test/mp_reverse.cpp @@ -0,0 +1,62 @@ + +// 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 + +struct X1 {}; +struct X2 {}; +struct X3 {}; +struct X4 {}; +struct X5 {}; +struct X6 {}; +struct X7 {}; +struct X8 {}; +struct X9 {}; + +int main() +{ + using boost::mp_list; + using boost::mp_reverse; + + { + 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>)); + 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>)); + 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>)); + 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>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::pair>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_reverse_fold.cpp b/test/mp_reverse_fold.cpp new file mode 100644 index 0000000..d646a11 --- /dev/null +++ b/test/mp_reverse_fold.cpp @@ -0,0 +1,56 @@ + +// 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 + +struct X1 {}; +struct X2 {}; +struct X3 {}; +struct X4 {}; + +template struct F {}; + +template using rev_push_back = boost::mp_push_back; +template using rev_push_front = boost::mp_push_front; + +int main() +{ + using boost::mp_list; + using boost::mp_reverse_fold; + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, void>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>>>>)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, void>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>>>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, void, F>, F>>>>)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>, rev_push_back>, mp_list>)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list<>, rev_push_front>, mp_list>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_set_contains.cpp b/test/mp_set_contains.cpp new file mode 100644 index 0000000..adc97d6 --- /dev/null +++ b/test/mp_set_contains.cpp @@ -0,0 +1,83 @@ + +// 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 + +int main() +{ + using boost::mp_list; + using boost::mp_set_contains; + using boost::mp_true; + using boost::mp_false; + + { + using L1 = mp_list<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + + using L2 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + + using L3 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + + using L4 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + } + + { + using L1 = std::tuple<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + + using L2 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + + using L3 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + + using L4 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + } + + { + using L3 = std::pair; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_true>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_false>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_set_push_back.cpp b/test/mp_set_push_back.cpp new file mode 100644 index 0000000..f39cfbb --- /dev/null +++ b/test/mp_set_push_back.cpp @@ -0,0 +1,122 @@ + +// 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 + +int main() +{ + using boost::mp_list; + using boost::mp_set_push_back; + + { + using L1 = mp_list<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + + 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>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + } + + { + using L2 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + + 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 L3 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + } + + { + using L4 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + + 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 L1 = std::tuple<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + { + using L2 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + { + using L3 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + { + using L4 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_set_push_front.cpp b/test/mp_set_push_front.cpp new file mode 100644 index 0000000..3c33c41 --- /dev/null +++ b/test/mp_set_push_front.cpp @@ -0,0 +1,124 @@ + +// 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 + +int main() +{ + using boost::mp_list; + using boost::mp_set_push_front; + + { + using L1 = mp_list<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + + 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>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + } + + { + using L2 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + + 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 L3 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + + 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 L4 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + + 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 L1 = std::tuple<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + { + using L2 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + { + using L3 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L3>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + { + using L4 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L4>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_unique.cpp b/test/mp_unique.cpp new file mode 100644 index 0000000..cdc2f98 --- /dev/null +++ b/test/mp_unique.cpp @@ -0,0 +1,54 @@ + +// 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 + +int main() +{ + using boost::mp_list; + using boost::mp_unique; + + { + 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>)); + 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>)); + 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>)); + 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>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, std::tuple>)); + } + + return boost::report_errors(); +}