Iros
 
Loading...
Searching...
No Matches
reverse_view.h
Go to the documentation of this file.
1#pragma once
2
16#include "di/meta/operations.h"
17#include "di/util/move.h"
19#include "di/util/store_if.h"
20
21namespace di::container {
22template<concepts::View View>
23requires(concepts::BidirectionalContainer<View>)
26 , public meta::EnableBorrowedContainer<ReverseView<View>, concepts::BorrowedContainer<View>> {
27private:
29
30public:
31 constexpr ReverseView()
33 = default;
34
35 constexpr ReverseView(View view) : m_view(util::move(view)) {}
36
37 constexpr auto base() const& -> View
38 requires(concepts::CopyConstructible<View>)
39 {
40 return m_view;
41 }
42
43 constexpr auto base() && -> View
45 {
46 return util::move(m_view);
47 }
48
49 constexpr auto begin() -> ReverseIterator<Iter> {
50 if (m_begin_cache.value.has_value()) {
51 return *m_begin_cache.value;
52 }
53 return m_begin_cache.value.emplace(
55 }
56
62
63 constexpr auto begin() const
64 requires(concepts::CommonContainer<View const>)
65 {
67 }
68
70
71 constexpr auto end() const
72 requires(concepts::CommonContainer<View const>)
73 {
75 }
76
77 constexpr auto size()
79 {
80 return container::size(m_view);
81 }
82
83 constexpr auto size() const
84 requires(concepts::SizedContainer<View const>)
85 {
86 return container::size(m_view);
87 }
88
89private:
90 View m_view {};
92 !concepts::CommonContainer<View>> m_begin_cache;
93};
94
95template<typename Con>
97}
Definition reverse_iterator.h:26
Definition reverse_view.h:26
constexpr auto base() &&-> View requires(concepts::CopyConstructible< View >)
Definition reverse_view.h:43
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition reverse_view.h:37
constexpr auto begin() -> ReverseIterator< Iter >
Definition reverse_view.h:49
constexpr auto begin() const
Definition reverse_view.h:63
constexpr auto end() -> ReverseIterator< Iter >
Definition reverse_view.h:69
constexpr auto end() const
Definition reverse_view.h:71
constexpr auto begin() -> ReverseIterator< Iter > requires(concepts::CommonContainer< View >)
Definition reverse_view.h:57
constexpr ReverseView(View view)
Definition reverse_view.h:35
constexpr auto size()
Definition reverse_view.h:77
constexpr ReverseView()=default
constexpr auto size() const
Definition reverse_view.h:83
Definition view_interface.h:26
Definition view.h:35
Definition common_container.h:10
Definition operations.h:34
Definition operations.h:27
Definition sized_container.h:8
Definition any_storable.h:9
Definition adjacent.h:8
Definition sequence.h:12
constexpr auto next
Definition next.h:35
constexpr auto move
Definition move.h:38
constexpr auto size
Definition size.h:54
constexpr auto make_reverse_iterator(Iter iter)
Definition reverse_iterator.h:110
constexpr auto end
Definition end.h:47
ReverseView(Con &&) -> ReverseView< meta::AsView< Con > >
constexpr auto begin
Definition begin.h:44
Definition merge_interfaces.h:6
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
Definition vocab.h:96
Definition enable_borrowed_container.h:9
Definition store_if.h:7