di 0.1.0
Loading...
Searching...
No Matches
fold_left_with_iter.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/meta/util.h"
9#include "di/util/move.h"
11
12namespace di::container {
13namespace detail {
14 struct FoldLeftWithIterFunction {
15 template<concepts::InputIterator Iter, concepts::SentinelFor<Iter> Sent, typename T,
16 concepts::IndirectlyBinaryLeftFoldable<T, Iter> Op>
17 constexpr auto operator()(Iter first, Sent last, T init, Op op) const {
19 using Res = InValueResult<Iter, R>;
20 if (first == last) {
21 return Res(util::move(first), R(util::move(init)));
22 }
23
24 R result = function::invoke(op, util::move(init), *first);
25 for (++first; first != last; ++first) {
26 result = function::invoke(op, util::move(result), *first);
27 }
28 return Res(util::move(first), util::move(result));
29 }
30
31 template<concepts::InputContainer Con, typename T,
32 concepts::IndirectlyBinaryLeftFoldable<T, meta::ContainerIterator<Con>> Op>
33 constexpr auto operator()(Con&& container, T init, Op op) const
34 -> InValueResult<meta::BorrowedIterator<Con>,
36 return (*this)(container::begin(container), container::end(container), util::move(init), util::ref(op));
37 }
38 };
39}
40
41constexpr inline auto fold_left_with_iter = detail::FoldLeftWithIterFunction {};
42}
43
44namespace di {
46}
constexpr auto last(concepts::detail::ConstantVector auto &vector, size_t count)
Definition vector_last.h:13
constexpr auto first(concepts::detail::ConstantVector auto &vector, size_t count)
Definition vector_first.h:13
Definition sequence.h:12
constexpr auto fold_left_with_iter
Definition fold_left_with_iter.h:41
constexpr auto end
Definition end.h:55
constexpr auto begin
Definition begin.h:52
constexpr auto invoke
Definition invoke.h:100
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
constexpr auto ref
Definition reference_wrapper.h:98
Definition any_storable.h:9