Iros
 
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>
22
23 template<typename 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>
39}
40
42 template<typename 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 bidirectional_iterator.h:8
Definition core.h:114
Definition sentinel_for.h:9
Definition tag_invoke.h:33
Definition sequence.h:13
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:47
constexpr auto begin
Definition begin.h:44
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 zstring_parser.h:9
Definition rend.h:41
constexpr auto operator()(T &&container) const -> detail::ValidREndReturn< T > auto
Definition rend.h:45