20 template<
typename R,
typename T>
21 concept ValidREndReturn = concepts::SentinelFor<R, decltype(container::rbegin(util::declval<T>()))>;
24 concept CustomREnd = concepts::TagInvocable<REndFunction, T> &&
25 ValidREndReturn<meta::Decay<meta::TagInvokeResult<REndFunction, T>>, T>;
28 concept MemberREnd =
requires(T&& container) {
29 { util::forward<T>(container).rend() } -> ValidREndReturn<T>;
33 concept ReverseIteratorREnd =
requires(T&& container) {
34 {
container::begin(util::forward<T>(container)) } -> concepts::BidirectionalIterator;
37 } -> concepts::SameAs<decltype(container::begin(util::forward<T>(container)))>;
44 (detail::CustomREnd<T> || detail::MemberREnd<T> || detail::ReverseIteratorREnd<T>) )
46 if constexpr (detail::CustomREnd<T>) {
48 }
else if constexpr (detail::MemberREnd<T>) {
49 return util::forward<T>(
container).rend();
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
constexpr auto in_place_type
Definition in_place_type.h:12
Definition any_storable.h:9
constexpr auto operator()(T &&container) const -> detail::ValidREndReturn< T > auto
Definition rend.h:45