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 @@
+
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).
+
+
+
+
+
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
.
+
+
+
+
+
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).
+
+
+
+
+
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
.
+
+
+
+
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