diff --git a/doc/html/mp11.html b/doc/html/mp11.html index 10403a9..b5bbe7b 100644 --- a/doc/html/mp11.html +++ b/doc/html/mp11.html @@ -119,6 +119,10 @@ I>
mp_take_c<L, N>
mp_take<L, N>
+
mp_insert_c<L, I, T...>
+
mp_insert<L, I, T...>
+
mp_erase_c<L, I, J>
+
mp_erase<L, I, J>
mp_replace<L, V, W>
mp_replace_if<L, P, W>
mp_replace_at_c<L, I, W>
@@ -1238,6 +1242,53 @@

+mp_insert_c<L, I, T...> +

+
template<class L, std::size_t I, class... T> using mp_insert_c = mp_append<mp_take_c<L, I>, mp_push_front<mp_drop_c<L, I>, T...>>;
+
+

+ Inserts the elements T... into the list L + at position I (a zero-based + index). +

+
+
+

+mp_insert<L, I, T...> +

+
template<class L, class I, class... T> using mp_insert = mp_append<mp_take<L, I>, mp_push_front<mp_drop<L, I>, T...>>;
+
+

+ Same as mp_insert_c, but + with a type argument I. +

+
+
+

+mp_erase_c<L, I, J> +

+
template<class L, std::size_t I, std::size_t J> using mp_erase = mp_append<mp_take_c<L, I>, mp_drop_c<L, J>>;
+
+

+ Removes from the list L + the elements with indices from I + (inclusive) to J (exclusive). +

+
+
+

+mp_erase<L, I, J> +

+
template<class L, class I, class J> using mp_erase = mp_append<mp_take<L, I>, mp_drop<L, J>>;
+
+

+ Same as mp_erase_c, but + with a type arguments I + and J. +

+
+
+

mp_replace<L, V, W>

template<class L, class V, class W> using mp_replace = /*...*/;
@@ -1900,7 +1951,7 @@
 
- +

Last revised: May 13, 2017 at 18:11:09 GMT

Last revised: May 13, 2017 at 18:21:04 GMT


diff --git a/doc/mp11/algorithm.qbk b/doc/mp11/algorithm.qbk index fe9cb95..8a555db 100644 --- a/doc/mp11/algorithm.qbk +++ b/doc/mp11/algorithm.qbk @@ -139,6 +139,30 @@ Same as `mp_at_c`, but with a type argument `I`. `I::value` must be a nonnegativ Same as `mp_take_c`, but with a type argument `N`. `N::value` must be a nonnegative number. [endsect] +[section `mp_insert_c`] + template using mp_insert_c = mp_append, mp_push_front, T...>>; + +Inserts the elements `T...` into the list `L` at position `I` (a zero-based index). +[endsect] + +[section `mp_insert`] + template using mp_insert = mp_append, mp_push_front, T...>>; + +Same as `mp_insert_c`, but with a type argument `I`. +[endsect] + +[section `mp_erase_c`] + template using mp_erase = mp_append, mp_drop_c>; + +Removes from the list `L` the elements with indices from `I` (inclusive) to `J` (exclusive). +[endsect] + +[section `mp_erase`] + template using mp_erase = mp_append, mp_drop>; + +Same as `mp_erase_c`, but with a type arguments `I` and `J`. +[endsect] + [section `mp_replace`] template using mp_replace = /*...*/; diff --git a/include/boost/mp11/algorithm.hpp b/include/boost/mp11/algorithm.hpp index 6511c81..298c25a 100644 --- a/include/boost/mp11/algorithm.hpp +++ b/include/boost/mp11/algorithm.hpp @@ -825,6 +825,7 @@ template struct mp_replace_at_impl template using mp_replace_at = typename detail::mp_replace_at_impl::type; template using mp_replace_at_c = typename detail::mp_replace_at_impl, W>::type; +//mp_for_each(f) namespace detail { @@ -850,6 +851,18 @@ template BOOST_CONSTEXPR F mp_for_each( F && f ) return detail::mp_for_each_impl( mp_rename(), std::forward(f) ); } +// mp_insert +template using mp_insert = mp_append, mp_push_front, T...>>; + +// mp_insert_c +template using mp_insert_c = mp_append, mp_push_front, T...>>; + +// mp_erase +template using mp_erase = mp_append, mp_drop>; + +// mp_erase_c +template using mp_erase_c = mp_append, mp_drop_c>; + } // namespace mp11 } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index f7afbe4..da5c569 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -65,6 +65,8 @@ run mp_none_of.cpp : : : $(REQ) ; run mp_replace_at.cpp : : : $(REQ) ; run mp_replace_at_c.cpp : : : $(REQ) ; run mp_for_each.cpp : : : $(REQ) ; +run mp_insert.cpp : : : $(REQ) ; +run mp_erase.cpp : : : $(REQ) ; # integral run integral.cpp : : : $(REQ) ; diff --git a/test/mp_erase.cpp b/test/mp_erase.cpp new file mode 100644 index 0000000..10e9638 --- /dev/null +++ b/test/mp_erase.cpp @@ -0,0 +1,171 @@ + +// Copyright 2015, 2017 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 X5 {}; + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_erase; + using boost::mp11::mp_erase_c; + using boost::mp11::mp_size_t; + + using _0 = mp_size_t<0>; + using _1 = mp_size_t<1>; + using _2 = mp_size_t<2>; + using _3 = mp_size_t<3>; + using _4 = mp_size_t<4>; + using _5 = mp_size_t<5>; + + { + using L1 = mp_list<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + 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, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + 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>)); + 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, 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, 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<>>)); + + using L3 = mp_list; + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<18>>, mp_list>)); + } + + { + using L1 = std::tuple<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + 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, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + 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>)); + 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::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::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<>>)); + + using L3 = std::tuple; + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_size_t<18>>, std::tuple>)); + } + + return boost::report_errors(); +} diff --git a/test/mp_insert.cpp b/test/mp_insert.cpp new file mode 100644 index 0000000..da5bc69 --- /dev/null +++ b/test/mp_insert.cpp @@ -0,0 +1,137 @@ + +// Copyright 2015, 2017 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 X5 {}; + +struct Y1 {}; +struct Y2 {}; + +int main() +{ + using boost::mp11::mp_list; + using boost::mp11::mp_insert; + using boost::mp11::mp_insert_c; + using boost::mp11::mp_size_t; + + { + using L1 = mp_list<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L1>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1>, mp_list>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, 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, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + 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>)); + 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>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, 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, mp_list>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, mp_list>)); + } + + { + using L1 = std::tuple<>; + + BOOST_TEST_TRAIT_TRUE((std::is_same, L1>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L1>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1>, std::tuple>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, 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, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, L2>)); + 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>)); + 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>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + BOOST_TEST_TRAIT_TRUE((std::is_same>, L2>)); + + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, 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, std::tuple>)); + BOOST_TEST_TRAIT_TRUE((std::is_same, Y1, Y2>, std::tuple>)); + } + + return boost::report_errors(); +}