di 0.1.0
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>
14 concept IsReverseView = concepts::InstanceOf<meta::RemoveCV<T>, ReverseView>;
15
16 template<typename T>
17 constexpr inline bool is_reverse_raw_view_helper = false;
18
19 template<typename I, bool sized>
20 constexpr inline bool is_reverse_raw_view_helper<View<ReverseIterator<I>, ReverseIterator<I>, sized>> = true;
21
22 template<typename T>
23 concept IsReverseRawView = is_reverse_raw_view_helper<meta::RemoveCV<T>>;
24
25 template<typename T>
26 concept CanReverseView = requires(T&& container) { ReverseView { util::forward<T>(container) }; };
27
28 struct ReverseFunction : function::pipeline::EnablePipeline {
29 template<concepts::ViewableContainer Con>
30 requires(IsReverseView<Con> || IsReverseRawView<Con> || CanReverseView<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 adjacent.h:8
constexpr auto reverse
Definition reverse.h:52
View(Iter, Sent) -> View< Iter, Sent >
ReverseView(Con &&) -> ReverseView< meta::AsView< Con > >
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition any_storable.h:9