13#ifndef RANGES_V3_ALGORITHM_FOLD_LEFT_HPP
14#define RANGES_V3_ALGORITHM_FOLD_LEFT_HPP
24#include <range/v3/detail/prologue.hpp>
31 template<
class F,
class T,
class I,
class U>
32 CPP_concept indirectly_binary_left_foldable_impl =
35 convertible_to<T, U> &&
36 invocable<F&, U, iter_reference_t<I>> &&
37 assignable_from<U&, invoke_result_t<F&, U, iter_reference_t<I>>>;
41 template<
class F,
class T,
class I>
42 CPP_concept indirectly_binary_left_foldable =
43 copy_constructible<F> &&
44 indirectly_readable<I> &&
45 invocable<F&, T, iter_reference_t<I>> &&
46 convertible_to<invoke_result_t<F&, T, iter_reference_t<I>>,
47 std::decay_t<invoke_result_t<F&, T, iter_reference_t<I>>>> &&
48 indirectly_binary_left_foldable_impl<F, T, I, std::decay_t<invoke_result_t<F&, T, iter_reference_t<I>>>>;
53 RANGES_FUNC_BEGIN(fold_left)
55 template(
typename I,
typename S,
typename T,
typename Op)(
56 requires sentinel_for<S, I> AND input_iterator<I> AND
57 indirectly_binary_left_foldable<Op, T, I>)
59 RANGES_FUNC(fold_left)(I
first, S last, T init, Op op)
61 using U = std::decay_t<invoke_result_t<Op &, T, iter_reference_t<I>>>;
65 return U(std::move(init));
68 U accum =
invoke(op, std::move(init), *first);
71 accum =
invoke(op, std::move(accum), *first);
76 template(
typename Rng,
typename T,
typename Op)(
77 requires input_range<Rng> AND
78 indirectly_binary_left_foldable<Op, T, iterator_t<Rng>>)
80 RANGES_FUNC(fold_left)(Rng && rng, T init, Op op)
82 return (*
this)(begin(rng), end(rng), std::move(init), std::move(op));
85 RANGES_FUNC_END(fold_left)
87 RANGES_FUNC_BEGIN(fold_left_first)
89 template(
typename I,
typename S,
typename Op)(
90 requires sentinel_for<S, I> AND input_iterator<I> AND
91 indirectly_binary_left_foldable<Op, iter_value_t<I>, I>
92 AND constructible_from<iter_value_t<I>, iter_reference_t<I>>)
94 RANGES_FUNC(fold_left_first)(I
first, S last, Op op)
96 using U = invoke_result_t<fold_left_fn, I, S, iter_value_t<I>, Op>;
102 iter_value_t<I> init = *
first;
106 fold_left_fn{}(std::move(first), std::move(last), std::move(init), op));
109 template(
typename R,
typename Op)(
110 requires input_range<R> AND
111 indirectly_binary_left_foldable<Op, range_value_t<R>, iterator_t<R>>
112 AND constructible_from<range_value_t<R>, range_reference_t<R>>)
114 RANGES_FUNC(fold_left_first)(R && rng, Op op)
116 return (*
this)(begin(rng), end(rng), std::move(op));
119 RANGES_FUNC_END(fold_left_first)
123#include <range/v3/detail/epilogue.hpp>
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition meta.hpp:541
front< Pair > first
Retrieve the first element of the pair Pair.
Definition meta.hpp:2251