Iros
 
Loading...
Searching...
No Matches
reverse.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/meta/core.h"
8#include "di/util/declval.h"
9#include "di/util/forward.h"
10
11namespace di::container::view {
12namespace detail {
13 template<typename T>
15
16 template<typename T>
17 constexpr inline bool is_reverse_raw_view_helper = false;
18
19 template<typename I, bool sized>
21
22 template<typename T>
24
25 template<typename T>
26 concept CanReverseView = requires(T&& container) { ReverseView { util::forward<T>(container) }; };
27
29 template<concepts::ViewableContainer Con>
31 constexpr auto operator()(Con&& container) const {
32 if constexpr (IsReverseView<Con>) {
33 return util::forward<Con>(container).base();
34 } else if constexpr (IsReverseRawView<Con>) {
35 using RevIter = decltype(container.begin());
36 using Iter = decltype(util::declval<RevIter>().base());
37 constexpr bool is_sized = concepts::SizedContainer<Con>;
38
39 if constexpr (is_sized) {
40 return container::View<Iter, Iter, is_sized>(container.end().base(), container.begin().base(),
41 container.size());
42 } else {
43 return container::View<Iter, Iter, is_sized>(container.end().base(), container.begin().base());
44 }
45 } else {
46 return ReverseView { util::forward<Con>(container) };
47 }
48 }
49 };
50}
51
52constexpr inline auto reverse = detail::ReverseFunction {};
53}
54
55namespace di {
56using view::reverse;
57}
Definition reverse_iterator.h:26
Definition reverse_view.h:26
Definition core.h:139
Definition sized_container.h:8
Definition adjacent.h:9
constexpr bool is_reverse_raw_view_helper
Definition reverse.h:17
Definition adjacent.h:8
constexpr auto reverse
Definition reverse.h:52
Definition sequence.h:12
View(Iter, Sent) -> View< Iter, Sent >
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition zstring_parser.h:9