di 0.1.0
Loading...
Searching...
No Matches
fold_right_last.h
Go to the documentation of this file.
1#pragma once
2
8
9namespace di::container {
10namespace detail {
11 struct FoldRightLastFunction {
12 template<concepts::BidirectionalIterator It, concepts::SentinelFor<It> Sent,
13 concepts::IndirectlyBinaryRightFoldable<meta::IteratorValue<It>, It> Op>
14 requires(concepts::ConstructibleFrom<meta::IteratorValue<It>, meta::IteratorReference<It>>)
15 constexpr auto operator()(It first, Sent last, Op op) const {
17 using Res = Optional<R>;
18 if (first == last) {
19 return Res();
20 }
21 auto it_last = container::prev(container::next(first, last));
22 return Res(in_place, container::fold_right(util::move(first), it_last, meta::IteratorValue<It>(*it_last),
23 util::ref(op)));
24 }
25
26 template<concepts::BidirectionalContainer Con,
27 concepts::IndirectlyBinaryRightFoldable<meta::ContainerValue<Con>, meta::ContainerIterator<Con>> Op>
28 requires(concepts::ConstructibleFrom<meta::ContainerValue<Con>, meta::ContainerReference<Con>>)
29 constexpr auto operator()(Con&& container, Op op) const {
30 return (*this)(container::begin(container), container::end(container), util::ref(op));
31 }
32 };
33}
34
35constexpr inline auto fold_right_last = detail::FoldRightLastFunction {};
36}
37
38namespace di {
40}
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 prev
Definition prev.h:28
constexpr auto next
Definition next.h:35
constexpr auto fold_right_last
Definition fold_right_last.h:35
constexpr auto end
Definition end.h:55
constexpr auto fold_right
Definition fold_right.h:33
constexpr auto begin
Definition begin.h:52
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
IteratorReference< ContainerIterator< T > > ContainerReference
Definition container_reference.h:8
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
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 in_place
Definition in_place.h:8