Iros
 
Loading...
Searching...
No Matches
view.h
Go to the documentation of this file.
1#pragma once
2
19#include "di/meta/constexpr.h"
20#include "di/meta/operations.h"
21#include "di/meta/util.h"
24#include "di/util/move.h"
25#include "di/util/store_if.h"
27
28namespace di::container {
29template<concepts::Iterator Iter, concepts::SentinelFor<Iter> Sent = Iter,
30 bool is_sized = concepts::SizedSentinelFor<Sent, Iter>>
31requires(is_sized || !concepts::SizedSentinelFor<Sent, Iter>)
32class View
33 : public ViewInterface<View<Iter, Sent, is_sized>>
34 , public meta::EnableBorrowedContainer<View<Iter, Sent, is_sized>>
35 , public util::AddMemberGet<View<Iter, Sent, is_sized>> {
36private:
37 constexpr static bool store_size = is_sized && !concepts::SizedSentinelFor<Sent, Iter>;
38
39 using SizeType = meta::IteratorSizeType<Iter>;
40 using SSizeType = meta::IteratorSSizeType<Iter>;
41
42public:
43 constexpr View()
45 = default;
46
47 constexpr View(concepts::ConvertibleToNonSlicing<Iter> auto iterator, Sent sentinel)
48 requires(!store_size)
49 : m_iterator(util::move(iterator)), m_sentinel(di::move(sentinel)) {}
50
51 constexpr View(concepts::ConvertibleToNonSlicing<Iter> auto iterator, Sent sentinel, SizeType size)
52 requires(is_sized)
53 : m_iterator(util::move(iterator)), m_sentinel(sentinel), m_size(size) {}
54
55 template<typename Cont>
59 constexpr View(Cont&& container)
60 requires(!store_size || concepts::SizedContainer<Cont>)
61 : m_iterator(container::begin(container)), m_sentinel(container::end(container)) {
62 if constexpr (store_size) {
63 m_size.value = static_cast<SizeType>(container::size(container));
64 }
65 }
66
67 template<concepts::BorrowedContainer Cont>
70 constexpr View(Cont&& container, SizeType size)
71 requires(is_sized)
73
74 constexpr auto begin() const -> Iter
75 requires(concepts::Copyable<Iter>)
76 {
77 return m_iterator;
78 }
79
80 [[nodiscard]] constexpr auto begin() -> Iter
82 {
83 return util::move(m_iterator);
84 }
85
86 constexpr auto end() const -> Sent { return m_sentinel; }
87
88 constexpr auto empty() const -> bool { return m_iterator == m_sentinel; }
89
90 constexpr auto size() const -> SizeType
91 requires(is_sized)
92 {
93 if constexpr (store_size) {
94 return m_size.value;
95 } else {
96 return m_sentinel - m_iterator;
97 }
98 }
99
100 constexpr auto advance(SSizeType n) -> View& {
101 container::advance(m_iterator, n, m_sentinel);
102 return *this;
103 }
104
105 [[nodiscard]] constexpr auto prev(SSizeType n = 1) const -> View
106 requires(concepts::BidirectionalIterator<Iter>)
107 {
108 auto result = *this;
109 result.advance(-n);
110 return result;
111 }
112
113 [[nodiscard]] constexpr auto next(SSizeType n = 1) const& -> View
114 requires(concepts::ForwardIterator<Iter>)
115 {
116 auto result = *this;
117 result.advance(n);
118 return result;
119 }
120
121 [[nodiscard]] constexpr auto next(SSizeType n = 1) && -> View {
122 this->advance(n);
123 return util::move(*this);
124 }
125
126private:
131
136
138 return 2;
139 }
140
141 template<concepts::DecaySameAs<View> Self>
142 constexpr friend auto tag_invoke(types::Tag<util::get_in_place>, Constexpr<0ZU>, Self&& self)
144 return util::forward_like<Self>(self.m_iterator);
145 }
146
147 template<concepts::DecaySameAs<View> Self>
148 constexpr friend auto tag_invoke(types::Tag<util::get_in_place>, Constexpr<1ZU>, Self&& self)
150 return util::forward_like<Self>(self.m_sentinel);
151 }
152
153 template<concepts::DecaySameAs<View> Self, typename T>
156 -> decltype(auto) {
157 if constexpr (concepts::SameAs<T, Iter>) {
158 return util::get<0>(util::forward<Self>(self));
159 } else {
160 return util::get<1>(util::forward<Self>(self));
161 }
162 }
163
164 Iter m_iterator;
165 Sent m_sentinel;
166 [[no_unique_address]] util::StoreIf<SizeType, store_size> m_size;
167};
168
169template<concepts::Iterator Iter, concepts::SentinelFor<Iter> Sent>
170View(Iter, Sent) -> View<Iter, Sent>;
171
172template<concepts::Iterator Iter, concepts::SentinelFor<Iter> Sent>
174
175template<concepts::BorrowedContainer Cont>
179
180template<concepts::BorrowedContainer Cont>
182}
183
184namespace di {
185using container::View;
186}
Definition view_interface.h:26
Definition view.h:35
constexpr friend auto tag_invoke(types::Tag< vocab::tuple_element >, types::InPlaceType< View >, Constexpr< 0ZU >) -> InPlaceType< Iter >
Definition view.h:127
constexpr View(concepts::ConvertibleToNonSlicing< Iter > auto iterator, Sent sentinel, SizeType size)
Definition view.h:51
constexpr View()=default
constexpr View(concepts::ConvertibleToNonSlicing< Iter > auto iterator, Sent sentinel)
Definition view.h:47
constexpr auto empty() const -> bool
Definition view.h:88
constexpr auto next(SSizeType n=1) const &-> View requires(concepts::ForwardIterator< Iter >)
Definition view.h:113
constexpr friend auto tag_invoke(types::Tag< util::get_in_place >, Constexpr< 0ZU >, Self &&self) -> meta::Like< Self, Iter >
Definition view.h:142
constexpr friend auto tag_invoke(types::Tag< util::get_in_place >, Constexpr< 1ZU >, Self &&self) -> meta::Like< Self, Sent >
Definition view.h:148
constexpr friend auto tag_invoke(types::Tag< vocab::tuple_element >, types::InPlaceType< View const >, Constexpr< 1ZU >) -> InPlaceType< Sent const >
Definition view.h:134
constexpr auto next(SSizeType n=1) &&-> View
Definition view.h:121
constexpr auto end() const -> Sent
Definition view.h:86
constexpr auto size() const -> SizeType requires(is_sized)
Definition view.h:90
constexpr friend auto tag_invoke(types::Tag< vocab::tuple_element >, types::InPlaceType< View const >, Constexpr< 0ZU >) -> InPlaceType< Iter const >
Definition view.h:132
constexpr View(Cont &&container)
Definition view.h:59
constexpr auto advance(SSizeType n) -> View &
Definition view.h:100
constexpr auto begin() -> Iter requires(!concepts::Copyable< Iter >)
Definition view.h:80
constexpr auto begin() const -> Iter requires(concepts::Copyable< Iter >)
Definition view.h:74
constexpr friend auto tag_invoke(types::Tag< util::get_in_place >, types::InPlaceType< T >, Self &&self) -> decltype(auto)
Definition view.h:155
constexpr View(Cont &&container, SizeType size)
Definition view.h:70
constexpr auto prev(SSizeType n=1) const -> View requires(concepts::BidirectionalIterator< Iter >)
Definition view.h:105
constexpr friend auto tag_invoke(types::Tag< vocab::tuple_element >, types::InPlaceType< View >, Constexpr< 1ZU >) -> InPlaceType< Sent >
Definition view.h:129
constexpr friend auto tag_invoke(types::Tag< vocab::tuple_size >, types::InPlaceType< View >) -> types::size_t
Definition view.h:137
Definition borrowed_container.h:8
This concept requires that the conversion from From to To would not result in converting a derived ty...
Definition operations.h:108
Definition operations.h:99
Definition operations.h:40
Definition util.h:59
Definition operations.h:27
Definition core.h:114
Definition sized_container.h:8
Definition sized_sentinel_for.h:9
Definition any_storable.h:9
Definition sequence.h:12
constexpr auto move
Definition move.h:38
View(Iter, Sent) -> View< Iter, Sent >
constexpr auto size
Definition size.h:54
constexpr auto advance
Definition advance.h:62
Definition merge_interfaces.h:6
decltype(container::size(util::declval< T >())) ContainerSizeType
Definition container_size_type.h:8
decltype(container::end(util::declval< T & >())) ContainerSentinel
Definition container_sentinel.h:8
Type< detail::LikeHelper< T, U > > Like
Definition language.h:468
decltype(container::iterator_ssize_type(types::in_place_type< meta::RemoveCVRef< T > >)) IteratorSSizeType
Definition iterator_ssize_type.h:8
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
MakeUnsigned< IteratorSSizeType< T > > IteratorSizeType
Definition iterator_size_type.h:8
std::size_t size_t
Definition size_t.h:12
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
Definition zstring_parser.h:9
Definition enable_borrowed_container.h:9
A wrapper for a constexpr value.
Definition core.h:77
Definition in_place_type.h:5
Definition store_if.h:7