13#ifndef RANGES_V3_ALGORITHM_FOLD_RIGHT_HPP
14#define RANGES_V3_ALGORITHM_FOLD_RIGHT_HPP
26#include <range/v3/detail/prologue.hpp>
38 invoke_result_t<F &, U, T>
39 operator()(T &&, U &&);
46 template<
class F,
class T,
class I>
53 RANGES_FUNC_BEGIN(fold_right)
55 template(
typename I,
typename S,
typename T,
typename Op)(
59 RANGES_FUNC(fold_right)(I first, S last, T init, Op op)
61 using U = std::decay_t<invoke_result_t<Op &, iter_reference_t<I>, T>>;
65 return U(std::move(init));
68 I tail = next(first, last);
69 U accum = invoke(op, *--tail, std::move(init));
72 accum = invoke(op, *--tail, std::move(accum));
77 template(
typename Rng,
typename T,
typename Op)(
78 requires bidirectional_range<Rng> AND
79 indirectly_binary_right_foldable<Op, T, iterator_t<Rng>>)
81 RANGES_FUNC(fold_right)(Rng && rng, T init, Op op)
83 return (*
this)(begin(rng), end(rng), std::move(init), std::move(op));
86 RANGES_FUNC_END(fold_right)
88 RANGES_FUNC_BEGIN(fold_right_last)
90 template(
typename I,
typename S,
typename Op)(
91 requires sentinel_for<S, I> AND bidirectional_iterator<I> AND
92 indirectly_binary_right_foldable<Op, iter_value_t<I>, I>
93 AND constructible_from<iter_value_t<I>, iter_reference_t<I>>)
95 RANGES_FUNC(fold_right_last)(I
first, S last, Op op)
97 using U = invoke_result_t<fold_right_fn, I, S, iter_value_t<I>, Op>;
100 return optional<U>();
103 I tail = prev(next(first, std::move(last)));
107 std::move(first), tail, iter_value_t<I>(*tail), std::move(op)));
110 template(
typename R,
typename Op)(
111 requires bidirectional_range<R> AND
112 indirectly_binary_right_foldable<Op, range_value_t<R>, iterator_t<R>>
113 AND constructible_from<range_value_t<R>, range_reference_t<R>>)
115 RANGES_FUNC(fold_right_last)(R && rng, Op op)
117 return (*
this)(begin(rng), end(rng), std::move(op));
120 RANGES_FUNC_END(fold_right_last)
124#include <range/v3/detail/epilogue.hpp>
The bidirectional_iterator concept.
The indirectly_binary_left_foldable concept.
The indirectly_binary_right_foldable concept.
The sentinel_for concept.
front< Pair > first
Retrieve the first element of the pair Pair.
Definition meta.hpp:2251
Definition fold_right.hpp:34