2017-03-14 22:57:07 +02:00
|
|
|
[/
|
|
|
|
|
/ Copyright 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)
|
|
|
|
|
/]
|
|
|
|
|
|
|
|
|
|
[section:algorithm Algorithms, `<boost/mp11/algorithm.hpp>`]
|
|
|
|
|
|
|
|
|
|
[section `mp_assign<L1, L2>`]
|
|
|
|
|
template<class L1, class L2> using mp_assign = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_assign<L1<T1...>, L2<T2...>>` is an alias for `L1<T2...>`. That is, it replaces the elements of `L1` with those of `L2`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_clear<L>`]
|
|
|
|
|
template<class L> using mp_clear = mp_assign<L, mp_list<>>;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_clear<L<T...>>` is an alias for `L<>`, that is, it removes the elements of `L`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_transform<F, L...>`]
|
|
|
|
|
template<template<class...> class F, class... L> using mp_transform = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_transform<F, L1<T1...>, L2<T2...>, ..., Ln<Tn...>>` applies `F` to each successive tuple of elements and returns `L1<F<T1, T2, ..., Tn>...>`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_transform_if<P, F, L>`]
|
|
|
|
|
template<template<class...> class P, template<class...> class F, class L> using mp_transform_if = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_transform_if` replaces the elements `T` of `L` for which `mp_to_bool<P<T>>` is `mp_true` with `F<T>`, and returns the result.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_fill<L, V>`]
|
|
|
|
|
template<class L, class V> using mp_fill = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_fill<L<T...>, V>` returns `L<V, V, ..., V>`, with the result having the same size as the input.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_count<L, V>`]
|
|
|
|
|
template<class L, class V> using mp_count = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_count<L, V>` returns `mp_size_t<N>`, where `N` is the number of elements of `L` same as `V`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_count_if<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_count_if = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_count_f<L, P>` returns `mp_size_t<N>`, where `N` is the number of elements `T` of `L` for which `mp_to_bool<P<T>>` is `mp_true`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_contains<L, V>`]
|
|
|
|
|
template<class L, class V> using mp_contains = mp_to_bool<mp_count<L, V>>;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_contains<L, V>` is `mp_true` when `L` contains an element `V`, `mp_false` otherwise.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_repeat_c<L, N>`]
|
|
|
|
|
template<class L, std::size_t N> using mp_repeat_c = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_repeat_c<L, N>` returns a list of the same type as `L` that consists of `N` concatenated copies of `L`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_repeat<L, N>`]
|
|
|
|
|
template<class L, class N> using mp_repeat = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Same as `mp_repeat_c` but with a type argument `N`. The number of copies is `N::value` and must be nonnegative.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_product<F, L...>`]
|
|
|
|
|
template<template<class...> class F, class... L> using mp_product = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_product<F, L1<T1...>, L2<T2...>, ..., Ln<Tn...>>` evaluates `F<U1, U2, ..., Un>` for values `Ui` taken from
|
|
|
|
|
the Cartesian product of the lists, as if the elements `Ui` are formed by `n` nested loops, each traversing `Li`.
|
|
|
|
|
It returns a list of type `L1` containing the results of the application of `F`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_drop_c<L, N>`]
|
|
|
|
|
template<class L, std::size_t N> using mp_drop_c = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_drop_c<L, N>` removes the first `N` elements of `L` and returns the result.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_drop<L, N>`]
|
|
|
|
|
template<class L, class N> using mp_drop = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Same as `mp_drop_c`, but with a type argument `N`. `N::value` must be a nonnegative number.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
2017-03-15 19:43:06 +02:00
|
|
|
[section `mp_iota_c<N>`]
|
2017-03-14 22:57:07 +02:00
|
|
|
template<std::size_t N> using mp_iota_c = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_iota_c<N>` is an alias for `mp_list<mp_size_t<0>, mp_size_t<1>, ..., mp_size_t<N-1>>`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
2017-03-15 19:43:06 +02:00
|
|
|
[section `mp_iota<N>`]
|
2017-03-14 22:57:07 +02:00
|
|
|
template<class N> using mp_iota = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Same as `mp_iota_c`, but with a type argument `N`. `N::value` must be a nonnegative number. Returns
|
|
|
|
|
`mp_list<std::integral_constant<T, 0>, std::integral_constant<T, 1>, ..., std::integral_constant<T, N::value-1>>`
|
|
|
|
|
where `T` is the type of `N::value`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_at_c<L, I>`]
|
|
|
|
|
template<class L, std::size_t I> using mp_at_c = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_at_c<L, I>` returns the `I`th element of `L`, zero-based.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_at<L, I>`]
|
|
|
|
|
template<class L, class I> using mp_at = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Same as `mp_at_c`, but with a type argument `I`. `I::value` must be a nonnegative number.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_take_c<L, N>`]
|
|
|
|
|
template<class L, std::size_t N> using mp_take_c = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_take_c<L, N>` returns a list of the same type as `L` containing the first `N` elements of `L`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_take<L, N>`]
|
|
|
|
|
template<class L, class N> using mp_take = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Same as `mp_take_c`, but with a type argument `N`. `N::value` must be a nonnegative number.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_replace<L, V, W>`]
|
|
|
|
|
template<class L, class V, class W> using mp_replace = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Replaces all `V` elements of `L` with `W` and returns the result.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_replace_if<L, P, W>`]
|
|
|
|
|
template<class L, template<class...> class P, class W> using mp_replace_if = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Replaces all `T` elements of `L` for which `mp_to_bool<P<T>>` is `mp_true` with `W` and returns the result.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_copy_if<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_copy_if = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Copies the elements `T` of `L` for which `mp_to_bool<P<T>>` is `mp_true` to a new list of the same type and returns it.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_remove<L, V>`]
|
|
|
|
|
template<class L, class V> using mp_remove = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Removes all `V` elements of `L` and returns the result.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_remove_if<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_remove_if = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
Removes all elements `T` of `L` for which `mp_to_bool<P<T>>` is `mp_true` and returns the result.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_partition<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_partition = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_partition<L<T...>, P>` partitions `L` into two lists `L<U1...>` and `L<U2...>` such that `mp_to_bool<P<T>>` is `mp_true`
|
|
|
|
|
for the elements of `L<U1...>` and `mp_false` for the elements of `L<U2...>`. Returns `L<L<U1...>, L<U2...>>`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_sort<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_sort = /*...*/;
|
2017-03-15 19:43:06 +02:00
|
|
|
|
|
|
|
|
`mp_sort<L, P>` sorts the list `L` according to the strict weak ordering `mp_to_bool<P<T, U>>`.
|
2017-03-14 22:57:07 +02:00
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_find_index<L, V>`]
|
|
|
|
|
template<class L, class V> using mp_find_index = /*...*/;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_find_index_if<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_find_index_if = /*...*/;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_find<L, V>`]
|
|
|
|
|
template<class L, class V> using mp_find = mp_drop<L, mp_find_index<L, V>>;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_find_if<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_find_if = mp_drop<L, mp_find_index_if<L, P>>;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_reverse<L>`]
|
|
|
|
|
template<class L> using mp_reverse = /*...*/;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_fold<L, V, F>`]
|
|
|
|
|
template<class L, class V, template<class...> class F> using mp_fold = /*...*/;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_reverse_fold<L, V, F>`]
|
|
|
|
|
template<class L, class V, template<class...> class F> using mp_reverse_fold = /*...*/;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_unique<L>`]
|
|
|
|
|
template<class L> using mp_unique = /*...*/;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_all_of<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_all_of = mp_bool< mp_count_if<L, P>::value == mp_size<L>::value >;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_none_of<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_none_of = mp_bool< mp_count_if<L, P>::value == 0 >;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[section `mp_any_of<L, P>`]
|
|
|
|
|
template<class L, template<class...> class P> using mp_any_of = mp_bool< mp_count_if<L, P>::value != 0 >;
|
|
|
|
|
[endsect]
|
|
|
|
|
|
|
|
|
|
[endsect]
|