Console Library 8.0.0
A header-only library that makes C++ simple
Loading...
Searching...
No Matches
view.h
Go to the documentation of this file.
11
12/*
13Copyright (c) 2026 MrXie1109
14
15Permission is hereby granted, free of charge, to any person obtaining a copy
16of this software and associated documentation files (the "Software"), to deal
17in the Software without restriction, including without limitation the rights
18to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
19copies of the Software, and to permit persons to whom the Software is
20furnished to do so, subject to the following conditions:
21
22The above copyright notice and this permission notice shall be included in all
23copies or substantial portions of the Software.
24
25THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
28AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
29LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
30OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31SOFTWARE.
32*/
33
34#pragma once
35#include <cstddef>
36#include <iostream>
37#include <iterator>
38#include <string>
39#include <vector>
40
41#include "../core/csexc.h"
42#include "../io/output.h"
43
44namespace console {
55 template <class Container>
56 class View {
57 using Iterator = typename Container::iterator;
58 using cIterator = typename Container::const_iterator;
60
61 public:
64
66 Iterator begin() const { return begin_; }
68 Iterator end() const { return end_; }
70 cIterator cbegin() const { return begin_; }
72 cIterator cend() const { return end_; }
73
78 View(Container &container) :
79 begin_(std::begin(container)), end_(std::end(container)) {}
80
87 View(Container &container, size_t start_pos, size_t end_pos) :
88 begin_(std::next(std::begin(container), start_pos)),
89 end_(std::next(std::begin(container), end_pos)) {}
90
97
99 size_t size() const { return std::distance(begin_, end_); }
100
106 auto operator[](size_t pos) const -> decltype(*begin_) {
107 return *std::next(begin_, pos);
108 }
109
116 auto at(size_t pos) const -> decltype(*begin_) {
117 if (pos >= size())
118 throw IndexError(std::to_string(pos) + " out of 0 ~ "
119 + std::to_string(size() - 1));
120 return (*this)[pos];
121 }
122
127 Container collect() const { return Container(begin_, end_); }
128 };
129
135 template <class Container>
136 class View<const Container> {
137 using cIterator = typename Container::const_iterator;
139
140 public:
143
144 cIterator begin() const { return begin_; }
145 cIterator end() const { return end_; }
146 cIterator cbegin() const { return begin_; }
147 cIterator cend() const { return end_; }
148
153 View(const Container &container) :
154 begin_(std::begin(container)), end_(std::end(container)) {}
155
162 View(const Container &container, size_t start_pos, size_t end_pos) :
163 begin_(std::next(std::begin(container), start_pos)),
164 end_(std::next(std::begin(container), end_pos)) {}
165
172
173 size_t size() const { return std::distance(begin_, end_); }
174
175 auto operator[](size_t pos) const -> decltype(*begin_) {
176 return *std::next(begin_, pos);
177 }
178
179 auto at(size_t pos) const -> decltype(*begin_) {
180 if (pos >= size())
181 throw IndexError(std::to_string(pos) + " out of 0 ~ "
182 + std::to_string(size() - 1));
183 return (*this)[pos];
184 }
185
190 Container collect() const { return Container(begin_, end_); }
191 };
192
198 template <class T>
199 class View<T[]> {
201
202 public:
203 typedef T *iterator;
204 typedef const T *const_iterator;
205
206 T *begin() const { return begin_; }
207 T *end() const { return end_; }
208 const T *cbegin() const { return begin_; }
209 const T *cend() const { return end_; }
210
211 View(T *begin, T *end) : begin_(begin), end_(end) {}
212 View(T *data, size_t count) : begin_(data), end_(data + count) {}
213
214 size_t size() const { return end_ - begin_; }
215
216 T &operator[](size_t pos) const { return begin_[pos]; }
217
218 T &at(size_t pos) const {
219 if (pos >= size())
220 throw IndexError(std::to_string(pos) + " out of 0 ~ "
221 + std::to_string(size() - 1));
222 return begin_[pos];
223 }
224
225 std::vector<T> collect() const { return {begin_, end_}; }
226 };
227
233 template <class T>
234 class View<const T[]> {
235 const T *begin_, *end_;
236
237 public:
238 typedef const T *iterator;
239 typedef const T *const_iterator;
240
241 const T *begin() const { return begin_; }
242 const T *end() const { return end_; }
243 const T *cbegin() const { return begin_; }
244 const T *cend() const { return end_; }
245
246 View(const T *begin, const T *end) : begin_(begin), end_(end) {}
247 View(const T *data, size_t count) : begin_(data), end_(data + count) {}
248
249 size_t size() const { return end_ - begin_; }
250
251 const T &operator[](size_t pos) const { return begin_[pos]; }
252
253 const T &at(size_t pos) const {
254 if (pos >= size())
255 throw IndexError(std::to_string(pos) + " out of 0 ~ "
256 + std::to_string(size() - 1));
257 return begin_[pos];
258 }
259
260 std::vector<T> collect() const { return {begin_, end_}; }
261 };
262
271 template <class CharT, class Traits>
272 inline std::basic_ostream<CharT, Traits> &operator<<(
273 std::basic_ostream<CharT, Traits> &os, const View<std::string> &sv) {
274 for (auto it = sv.begin(); it != sv.end(); ++it) os << *it;
275 return os;
276 }
277
287 template <class CharT, class Traits, class Container>
288 std::basic_ostream<CharT, Traits> &operator<<(
289 std::basic_ostream<CharT, Traits> &os, const View<Container> &v) {
290 return os << v.collect();
291 }
292
293 // ========================== 工厂函数 ==========================
294
300
307 template <class Container>
308 View<Container> make_view(Container &cont) {
309 return {cont};
310 }
311
318 template <class Container>
319 View<const Container> make_view(const Container &cont) {
320 return {cont};
321 }
322
331 template <class Container>
332 View<Container> make_view(Container &cont, size_t start, size_t end) {
333 return {cont, start, end};
334 }
335
344 template <class Container>
345 View<const Container>
346 make_view(const Container &cont, size_t start, size_t end) {
347 return {cont, start, end};
348 }
349
357 template <class Container>
359 typename Container::iterator begin, typename Container::iterator end) {
360 return {begin, end};
361 }
362
370 template <class Container>
371 View<const Container> make_view(typename Container::const_iterator begin,
372 typename Container::const_iterator end) {
373 return {begin, end};
374 }
375
383 template <class T>
384 View<T[]> make_view(T *begin, T *end) {
385 return {begin, end};
386 }
387
395 template <class T>
396 View<const T[]> make_view(const T *begin, const T *end) {
397 return {begin, end};
398 }
399
407 template <class T>
408 View<T[]> make_view(T *data, size_t count) {
409 return {data, count};
410 }
411
419 template <class T>
420 View<const T[]> make_view(const T *data, size_t count) {
421 return {data, count};
422 }
423 // end of view_factories
425}
IndexError(const std::string &msg)
构造 IndexError。
Definition csexc.h:153
const T * const_iterator
Definition view.h:204
T & operator[](size_t pos) const
Definition view.h:216
View(T *begin, T *end)
Definition view.h:211
const T * cbegin() const
Definition view.h:208
T & at(size_t pos) const
Definition view.h:218
std::vector< T > collect() const
Definition view.h:225
T * iterator
Definition view.h:203
T * end_
Definition view.h:200
T * end() const
Definition view.h:207
T * begin() const
Definition view.h:206
T * begin_
Definition view.h:200
const T * cend() const
Definition view.h:209
size_t size() const
Definition view.h:214
View(T *data, size_t count)
Definition view.h:212
View(const Container &container, size_t start_pos, size_t end_pos)
构造常量容器子区间的视图。
Definition view.h:162
cIterator end() const
Definition view.h:145
Container collect() const
将常量视图中的元素复制到新容器。
Definition view.h:190
typename Container::const_iterator cIterator
Definition view.h:137
auto operator[](size_t pos) const -> decltype(*begin_)
Definition view.h:175
cIterator begin() const
Definition view.h:144
cIterator begin_
Definition view.h:138
View(const Container &container)
构造整个常量容器的视图。
Definition view.h:153
cIterator cend() const
Definition view.h:147
View(cIterator begin, cIterator end)
从常量迭代器对构造视图。
Definition view.h:171
cIterator iterator
Definition view.h:141
auto at(size_t pos) const -> decltype(*begin_)
Definition view.h:179
cIterator const_iterator
Definition view.h:142
size_t size() const
Definition view.h:173
cIterator end_
Definition view.h:138
cIterator cbegin() const
Definition view.h:146
const T * cbegin() const
Definition view.h:243
const T & operator[](size_t pos) const
Definition view.h:251
const T * begin() const
Definition view.h:241
const T * iterator
Definition view.h:238
View(const T *data, size_t count)
Definition view.h:247
const T * end() const
Definition view.h:242
std::vector< T > collect() const
Definition view.h:260
View(const T *begin, const T *end)
Definition view.h:246
const T * begin_
Definition view.h:235
const T * cend() const
Definition view.h:244
size_t size() const
Definition view.h:249
const T * const_iterator
Definition view.h:239
const T * end_
Definition view.h:235
const T & at(size_t pos) const
Definition view.h:253
容器的非拥有视图(可变版本)。
Definition view.h:56
Iterator begin() const
返回起始迭代器。
Definition view.h:66
cIterator cbegin() const
返回常量起始迭代器。
Definition view.h:70
Container collect() const
将视图中的元素复制到一个新的容器中。
Definition view.h:127
auto operator[](size_t pos) const -> decltype(*begin_)
无边界检查的下标访问。
Definition view.h:106
Iterator end_
Definition view.h:59
View(Iterator begin, Iterator end)
从迭代器对构造视图。
Definition view.h:96
auto at(size_t pos) const -> decltype(*begin_)
带边界检查的下标访问。
Definition view.h:116
typename Container::iterator Iterator
Definition view.h:57
cIterator const_iterator
Definition view.h:63
typename Container::const_iterator cIterator
Definition view.h:58
View(Container &container)
构造整个容器的视图。
Definition view.h:78
size_t size() const
返回视图中的元素个数。
Definition view.h:99
Iterator end() const
返回结束迭代器。
Definition view.h:68
View(Container &container, size_t start_pos, size_t end_pos)
构造容器子区间的视图。
Definition view.h:87
Iterator begin_
Definition view.h:59
cIterator cend() const
返回常量结束迭代器。
Definition view.h:72
Iterator iterator
Definition view.h:62
定义 console 库使用的自定义异常类层次结构。
View< Container > make_view(Container &cont)
创建整个容器的视图(可变版本)。
Definition view.h:308
本库所有组件所在的顶层命名空间。
@ T
Definition kb.h:99
MultiArray< decltype(std::declval< T >()<< std::declval< U >()), Dims... > operator<<(const MultiArray< T, Dims... > &a, const MultiArray< U, Dims... > &b)
Definition multiarray.h:1607
T next(typename Generator< Derived, T >::iterator &it)
从迭代器获取下一个值的辅助函数。
Definition gen.h:190
提供 STL 容器的格式化输出和灵活的输出控制工具。