di 0.1.0
Loading...
Searching...
No Matches
fold_left_first_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"
12
13namespace di::container {
14namespace detail {
15 struct FoldLeftFirstWithIterFunction {
16 template<concepts::InputIterator Iter, concepts::SentinelFor<Iter> Sent,
17 concepts::IndirectlyBinaryLeftFoldable<meta::IteratorValue<Iter>, Iter> Op>
18 requires(concepts::ConstructibleFrom<meta::IteratorValue<Iter>, meta::IteratorReference<Iter>>)
19 constexpr auto operator()(Iter first, Sent last, Op op) const {
21 using Res = InValueResult<Iter, Optional<R>>;
22 if (first == last) {
23 return Res(util::move(first), nullopt);
24 }
25
26 auto result = Optional<R> { in_place, *first };
27 for (++first; first != last; ++first) {
28 result = function::invoke(op, *util::move(result), *first);
29 }
30 return Res(util::move(first), util::move(result));
31 }
32
33 template<concepts::InputContainer Con,
34 concepts::IndirectlyBinaryLeftFoldable<meta::ContainerValue<Con>, meta::ContainerIterator<Con>> Op>
35 requires(concepts::ConstructibleFrom<meta::ContainerValue<Con>, meta::ContainerReference<Con>>)
36 constexpr auto operator()(Con&& container, Op op) const -> InValueResult<
39 return (*this)(container::begin(container), container::end(container), util::ref(op));
40 }
41 };
42}
43
44constexpr inline auto fold_left_first_with_iter = detail::FoldLeftFirstWithIterFunction {};
45}
46
47namespace di {
49}
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 end
Definition end.h:55
constexpr auto fold_left_first_with_iter
Definition fold_left_first_with_iter.h:44
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
Conditional< concepts::BorrowedContainer< Con >, ContainerIterator< Con >, container::Dangling > BorrowedIterator
Definition borrowed_iterator.h:11
IteratorReference< ContainerIterator< T > > ContainerReference
Definition container_reference.h:8
decltype(function::detail::invoke_impl(util::declval< Ts >()...)) InvokeResult
Definition invoke.h:64
meta::Type< decltype(container::iterator_value(types::in_place_type< meta::RemoveCVRef< T > >))> IteratorValue
Definition iterator_value.h:8
decltype(*util::declval< T const & >()) IteratorReference
Definition iterator_reference.h:7
IteratorValue< ContainerIterator< T > > ContainerValue
Definition container_value.h:8
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
constexpr auto ref
Definition reference_wrapper.h:98
Definition any_storable.h:9
constexpr auto nullopt
Definition nullopt.h:15
constexpr auto in_place
Definition in_place.h:8