Iros
 
Loading...
Searching...
No Matches
view_interface.h
Go to the documentation of this file.
1#pragma once
2
19#include "di/meta/core.h"
20#include "di/meta/language.h"
22
23namespace di::container {
24template<typename Self>
25requires(concepts::Class<Self> && concepts::SameAs<Self, meta::RemoveCV<Self>>)
26class ViewInterface : public meta::EnableView<Self> {
27public:
28 constexpr auto empty() -> bool
30 {
31 if constexpr (concepts::SizedContainer<Self>) {
32 return container::size(self()) == 0;
33 } else {
34 return container::begin(self()) == container::end(self());
35 }
36 }
37
38 constexpr auto empty() const -> bool
39 requires(concepts::SizedContainer<Self const> || concepts::ForwardContainer<Self const>)
40 {
41 if constexpr (concepts::SizedContainer<Self>) {
42 return container::size(self()) == 0;
43 } else {
44 return container::begin(self()) == container::end(self());
45 }
46 }
47
48 constexpr explicit operator bool()
50 {
51 return !container::empty(self());
52 }
53
54 constexpr explicit operator bool() const
55 requires(concepts::HasEmptyContainer<Self const>)
56 {
57 return !container::empty(self());
58 }
59
60 constexpr auto cbegin() { return container::cbegin(self()); }
61 constexpr auto cbegin() const
62 requires(concepts::Container<Self const>)
63 {
64 return container::cbegin(self());
65 }
66
67 constexpr auto cend() { return container::cend(self()); }
68 constexpr auto cend() const
69 requires(concepts::Container<Self const>)
70 {
71 return container::cend(self());
72 }
73
74 constexpr auto data()
76 {
77 return container::begin(self());
78 }
79
80 constexpr auto data() const
81 requires(concepts::Container<Self const> && concepts::ContiguousIterator<meta::ContainerIterator<Self const>>)
82 {
83 return container::begin(self());
84 }
85
92
93 constexpr auto size() const
94 requires(concepts::ForwardContainer<Self const> &&
95 concepts::SizedSentinelFor<meta::ContainerIterator<Self const>, meta::ContainerSentinel<Self const>>)
96 {
97 return container::end(self()) - container::begin(self());
98 }
99
100 constexpr auto front()
102 {
104 if (this->empty()) {
105 return Result(vocab::nullopt);
106 }
107 return Result(*container::begin(self()));
108 }
109
110 constexpr auto front() const
111 requires(concepts::ForwardContainer<Self const>)
112 {
114 if (this->empty()) {
115 return Result(vocab::nullopt);
116 }
117 return Result(*container::begin(self()));
118 }
119
120 constexpr auto back()
122 {
124 if (this->empty()) {
125 return Result(vocab::nullopt);
126 }
127 return Result(*container::prev(container::end(self())));
128 }
129
130 constexpr auto back() const
131 requires(concepts::BidirectionalContainer<Self const> && concepts::CommonContainer<Self const>)
132 {
134 if (this->empty()) {
135 return Result(vocab::nullopt);
136 }
137 return Result(*container::prev(container::end(self())));
138 }
139
140 template<concepts::RandomAccessContainer Cont = Self>
141 constexpr auto operator[](meta::ContainerSSizeType<Cont> n) -> decltype(auto) {
142 return container::begin(self())[n];
143 }
144
145 template<concepts::RandomAccessContainer Cont = Self const>
146 constexpr auto operator[](meta::ContainerSSizeType<Cont> n) const -> decltype(auto) {
147 return container::begin(self())[n];
148 }
149
150 template<concepts::RandomAccessContainer Cont = Self>
152 if (n < 0 || n >= this->size()) {
153 return vocab::nullopt;
154 }
155 return container::begin(self())[n];
156 }
157
158 template<concepts::RandomAccessContainer Cont = Self const>
160 if (n < 0 || n >= this->size()) {
161 return vocab::nullopt;
162 }
163 return container::begin(self())[n];
164 }
165
166private:
167 constexpr auto self() -> Self& { return static_cast<Self&>(*this); }
168 constexpr auto self() const -> Self const& { return static_cast<Self const&>(*this); }
169};
170}
171
172namespace di {
173namespace container::view {}
174
175namespace view = container::view;
176}
Definition view_interface.h:26
constexpr auto at(meta::ContainerSSizeType< Cont > n) -> Optional< meta::ContainerReference< Cont > >
Definition view_interface.h:151
constexpr auto operator[](meta::ContainerSSizeType< Cont > n) const -> decltype(auto)
Definition view_interface.h:146
constexpr auto back() const
Definition view_interface.h:130
constexpr auto cend() const
Definition view_interface.h:68
constexpr auto cbegin() const
Definition view_interface.h:61
constexpr auto at(meta::ContainerSSizeType< Cont > n) const -> Optional< meta::ContainerReference< Cont > >
Definition view_interface.h:159
constexpr auto front() const
Definition view_interface.h:110
constexpr auto cbegin()
Definition view_interface.h:60
constexpr auto data()
Definition view_interface.h:74
constexpr auto data() const
Definition view_interface.h:80
constexpr auto back()
Definition view_interface.h:120
constexpr auto operator[](meta::ContainerSSizeType< Cont > n) -> decltype(auto)
Definition view_interface.h:141
constexpr auto cend()
Definition view_interface.h:67
constexpr auto size()
Definition view_interface.h:86
constexpr auto size() const
Definition view_interface.h:93
constexpr auto empty() const -> bool requires(concepts::SizedContainer< Self const >||concepts::ForwardContainer< Self const >)
Definition view_interface.h:38
constexpr auto empty() -> bool requires(concepts::SizedContainer< Self >||concepts::ForwardContainer< Self >)
Definition view_interface.h:28
constexpr auto front()
Definition view_interface.h:100
Definition optional_forward_declaration.h:5
Definition bidirectional_container.h:8
Definition common_container.h:10
Definition contiguous_iterator.h:9
Definition forward_container.h:8
Definition has_empty_container.h:7
Definition sized_container.h:8
Definition sized_sentinel_for.h:9
Definition any_storable.h:9
Definition adjacent.h:8
Definition sequence.h:12
constexpr auto prev
Definition prev.h:28
constexpr auto empty
Definition empty.h:45
constexpr auto cend
Definition cend.h:23
constexpr auto size
Definition size.h:54
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
constexpr auto cbegin
Definition cbegin.h:24
Definition merge_interfaces.h:6
IteratorSSizeType< ContainerIterator< T > > ContainerSSizeType
Definition container_ssize_type.h:8
decltype(container::end(util::declval< T & >())) ContainerSentinel
Definition container_sentinel.h:8
Expected< T, Error > Result
Definition result.h:8
constexpr auto nullopt
Definition nullopt.h:15
Definition zstring_parser.h:9