diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index e69bbaf..cc749a9 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -1127,6 +1127,37 @@ template using mp_rotate_right = mp_rotate_right_c // in detail/mp_min_element.hpp +// mp_power_set +namespace detail +{ + +template struct mp_power_set_impl; + +} // namespace detail + +template using mp_power_set = typename detail::mp_power_set_impl::type; + +namespace detail +{ + +template class L> struct mp_power_set_impl< L<> > +{ + using type = L< L<> >; +}; + +template class L, class T1, class... T> struct mp_power_set_impl< L > +{ + using S1 = mp_power_set< L >; + + template using _f = mp_push_front; + + using S2 = mp_transform<_f, S1>; + + using type = mp_append< S1, S2 >; +}; + +} // namespace detail + } // namespace mp11 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index 4ccab62..ff8432c 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -119,6 +119,7 @@ run mp_pop_back.cpp ; run mp_flatten.cpp ; run mp_rotate_left.cpp ; run mp_rotate_right.cpp ; +run mp_power_set.cpp ; # integral run integral.cpp ; diff --git a/test/mp_power_set.cpp b/test/mp_power_set.cpp new file mode 100644 index 0000000..250bfbb --- /dev/null +++ b/test/mp_power_set.cpp @@ -0,0 +1,33 @@ +// Copyright 2020 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include +#include + +struct X1 {}; +struct X2 {}; +struct X3 {}; + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_power_set; + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< mp_list<> >, mp_list> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< mp_list >, mp_list< mp_list<>, mp_list > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< mp_list >, mp_list< mp_list<>, mp_list, mp_list, mp_list > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< mp_list >, mp_list< mp_list<>, mp_list, mp_list, mp_list > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< mp_list >, mp_list< mp_list<>, mp_list, mp_list, mp_list, mp_list, mp_list, mp_list, mp_list > >)); + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< std::tuple<> >, std::tuple> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< std::tuple >, std::tuple< std::tuple<>, std::tuple > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< std::tuple >, std::tuple< std::tuple<>, std::tuple, std::tuple, std::tuple > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< std::tuple >, std::tuple< std::tuple<>, std::tuple, std::tuple, std::tuple > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_power_set< std::tuple >, std::tuple< std::tuple<>, std::tuple, std::tuple, std::tuple, std::tuple, std::tuple, std::tuple, std::tuple > >)); + + return boost::report_errors(); +}