di 0.1.0
Loading...
Searching...
No Matches
rend.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/meta/core.h"
11#include "di/meta/language.h"
12#include "di/meta/util.h"
13#include "di/util/declval.h"
14#include "di/util/forward.h"
15
16namespace di::container {
17struct REndFunction;
18
19namespace detail {
20 template<typename R, typename T>
21 concept ValidREndReturn = concepts::SentinelFor<R, decltype(container::rbegin(util::declval<T>()))>;
22
23 template<typename T>
24 concept CustomREnd = concepts::TagInvocable<REndFunction, T> &&
25 ValidREndReturn<meta::Decay<meta::TagInvokeResult<REndFunction, T>>, T>;
26
27 template<typename T>
28 concept MemberREnd = requires(T&& container) {
29 { util::forward<T>(container).rend() } -> ValidREndReturn<T>;
30 };
31
32 template<typename T>
33 concept ReverseIteratorREnd = requires(T&& container) {
34 { container::begin(util::forward<T>(container)) } -> concepts::BidirectionalIterator;
35 {
36 container::end(util::forward<T>(container))
37 } -> concepts::SameAs<decltype(container::begin(util::forward<T>(container)))>;
38 };
39}
40
42 template<typename T>
44 (detail::CustomREnd<T> || detail::MemberREnd<T> || detail::ReverseIteratorREnd<T>) )
45 constexpr auto operator()(T&& container) const -> detail::ValidREndReturn<T> auto {
46 if constexpr (detail::CustomREnd<T>) {
47 return function::tag_invoke(*this, util::forward<T>(container));
48 } else if constexpr (detail::MemberREnd<T>) {
49 return util::forward<T>(container).rend();
50 } else {
51 return make_reverse_iterator(container::end(util::forward<T>(container)));
52 }
53 }
54};
55
56constexpr inline auto rend = REndFunction {};
57}
58
59namespace di {
60using container::rend;
61}
Definition sequence.h:12
constexpr struct di::container::EnableBorrowedContainer enable_borrowed_container
constexpr auto rend
Definition rend.h:56
constexpr auto make_reverse_iterator(Iter iter)
Definition reverse_iterator.h:110
constexpr auto end
Definition end.h:55
constexpr auto begin
Definition begin.h:52
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
RemoveConst< RemoveVolatile< T > > RemoveCV
Definition core.h:57
constexpr auto in_place_type
Definition in_place_type.h:12
Definition any_storable.h:9
Definition rend.h:41
constexpr auto operator()(T &&container) const -> detail::ValidREndReturn< T > auto
Definition rend.h:45