diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 4ee111b..cd13332 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -1170,6 +1170,20 @@ template class L, class T1, class... T> struct mp_power_set_i } // namespace detail +// mp_partial_sum +namespace detail +{ + +template class F> struct mp_partial_sum_impl_f +{ + template, T>> using fn = mp_list, N>>; +}; + +} // namespace detail + +template class F> using mp_partial_sum = mp_second>, detail::mp_partial_sum_impl_f> >; +template using mp_partial_sum_q = mp_partial_sum; + } // namespace mp11 } // namespace boost diff --git a/test/Jamfile b/test/Jamfile index ff8432c..09afb45 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -120,6 +120,7 @@ run mp_flatten.cpp ; run mp_rotate_left.cpp ; run mp_rotate_right.cpp ; run mp_power_set.cpp ; +run mp_partial_sum.cpp ; # integral run integral.cpp ; diff --git a/test/mp_partial_sum.cpp b/test/mp_partial_sum.cpp new file mode 100644 index 0000000..75366b0 --- /dev/null +++ b/test/mp_partial_sum.cpp @@ -0,0 +1,88 @@ +// 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 +#include +#include +#include + +struct X1 {}; +struct X2 {}; +struct X3 {}; + +template struct F {}; + +struct Q +{ + template struct fn {}; +}; + +int main() +{ + using boost::mp11::mp_partial_sum; + using boost::mp11::mp_list; + using boost::mp11::mp_list_c; + using boost::mp11::mp_int; + using boost::mp11::mp_size_t; + using boost::mp11::mp_plus; + using boost::mp11::mp_rename; + using boost::mp11::mp_partial_sum_q; + using boost::mp11::mp_quote; + + { + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_list<>, void, F >, mp_list<> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_list, void, F >, mp_list< F > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_list, void, F >, mp_list< F, F, X2> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_list, void, F >, mp_list< F, F, X2>, F, X2>, X3> > >)); + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_list_c, mp_int<0>, mp_plus >, mp_list< mp_int<7>, mp_int<14>, mp_int<16> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_list_c, mp_size_t<0>, mp_plus >, mp_list< mp_size_t<7>, mp_size_t<14>, mp_size_t<16> > >)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list<>, void, mp_quote >, mp_list<> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list, void, mp_quote >, mp_list< F > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list, void, mp_quote >, mp_list< F, F, X2> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list, void, mp_quote >, mp_list< F, F, X2>, F, X2>, X3> > >)); + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list<>, void, Q >, mp_list<> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list, void, Q >, mp_list< Q::fn > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list, void, Q >, mp_list< Q::fn, Q::fn, X2> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list, void, Q >, mp_list< Q::fn, Q::fn, X2>, Q::fn, X2>, X3> > >)); + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list_c, mp_int<0>, mp_quote >, mp_list< mp_int<7>, mp_int<14>, mp_int<16> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_list_c, mp_size_t<0>, mp_quote >, mp_list< mp_size_t<7>, mp_size_t<14>, mp_size_t<16> > >)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< std::tuple<>, void, F >, std::tuple<> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< std::tuple, void, F >, std::tuple< F > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< std::tuple, void, F >, std::tuple< F, F, X2> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< std::tuple, void, F >, std::tuple< F, F, X2>, F, X2>, X3> > >)); + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_rename, std::tuple>, mp_int<0>, mp_plus >, std::tuple< mp_int<7>, mp_int<14>, mp_int<16> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum< mp_rename, std::tuple>, mp_size_t<0>, mp_plus >, std::tuple< mp_size_t<7>, mp_size_t<14>, mp_size_t<16> > >)); + } + + { + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple<>, void, mp_quote >, std::tuple<> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple, void, mp_quote >, std::tuple< F > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple, void, mp_quote >, std::tuple< F, F, X2> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple, void, mp_quote >, std::tuple< F, F, X2>, F, X2>, X3> > >)); + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple<>, void, Q >, std::tuple<> >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple, void, Q >, std::tuple< Q::fn > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple, void, Q >, std::tuple< Q::fn, Q::fn, X2> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< std::tuple, void, Q >, std::tuple< Q::fn, Q::fn, X2>, Q::fn, X2>, X3> > >)); + + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_rename, std::tuple>, mp_int<0>, mp_quote >, std::tuple< mp_int<7>, mp_int<14>, mp_int<16> > >)); + BOOST_TEST_TRAIT_TRUE((std::is_same< mp_partial_sum_q< mp_rename, std::tuple>, mp_size_t<0>, mp_quote >, std::tuple< mp_size_t<7>, mp_size_t<14>, mp_size_t<16> > >)); + } + + return boost::report_errors(); +}