NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
array.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_CONTAINER_ARRAY_HPP__
2#define NEFORCE_CORE_CONTAINER_ARRAY_HPP__
3
10
15NEFORCE_BEGIN_NAMESPACE__
16
22
32template <bool IsConst, size_t Size, typename Array>
33struct array_iterator : iiterator<array_iterator<IsConst, Size, Array>> {
34public:
35 using container_type = Array;
36 using value_type = typename container_type::value_type;
37 using size_type = typename container_type::size_type;
38 using difference_type = typename container_type::difference_type;
40 using reference = conditional_t<IsConst, typename container_type::const_reference,
41 typename container_type::reference>;
42 using pointer = conditional_t<IsConst, typename container_type::const_pointer,
43 typename container_type::pointer>;
44
45private:
46 pointer current_ = nullptr;
47 const container_type* container_ = nullptr;
48
49public:
50 constexpr array_iterator() noexcept = default;
51 NEFORCE_CONSTEXPR20 ~array_iterator() = default;
52
53 constexpr array_iterator(const array_iterator&) noexcept = default;
54 constexpr array_iterator& operator=(const array_iterator&) noexcept = default;
55 constexpr array_iterator(array_iterator&&) noexcept = default;
56 constexpr array_iterator& operator=(array_iterator&&) noexcept = default;
57
63 constexpr array_iterator(pointer ptr, const container_type* vec) noexcept :
64 current_(ptr),
65 container_(vec) {}
66
71 NEFORCE_NODISCARD constexpr reference dereference() const noexcept {
72 NEFORCE_DEBUG_VERIFY(current_ && container_, "Attempting to dereference on a null pointer");
73 NEFORCE_DEBUG_VERIFY(current_ >= container_->data() && current_ < container_->data() + Size,
74 "Attempting to dereference out of boundary");
75 return *current_;
76 }
77
81 constexpr void increment() noexcept {
82 NEFORCE_DEBUG_VERIFY(current_ && container_, "Attempting to increment a null pointer");
83 NEFORCE_DEBUG_VERIFY(current_ < container_->data() + Size, "Attempting to increment out of boundary");
84 ++current_;
85 }
86
90 constexpr void decrement() noexcept {
91 NEFORCE_DEBUG_VERIFY(current_ && container_, "Attempting to decrement a null pointer");
92 NEFORCE_DEBUG_VERIFY(current_ > container_->data(), "Attempting to decrement out of boundary");
93 --current_;
94 }
95
100 constexpr void advance(difference_type off) noexcept {
101 NEFORCE_DEBUG_VERIFY((current_ && container_) || off == 0, "Attempting to advance a null pointer");
102 NEFORCE_DEBUG_VERIFY(current_ + off >= container_->data() && current_ + off <= container_->data() + Size,
103 "Attempting to advance out of boundary");
104 current_ += off;
105 }
106
112 NEFORCE_NODISCARD constexpr difference_type distance_to(const array_iterator& other) const noexcept {
113 NEFORCE_DEBUG_VERIFY(container_ == other.container_, "Attempting to distance to a different container");
114 return static_cast<difference_type>(other.current_ - current_);
115 }
116
122 NEFORCE_NODISCARD constexpr reference operator[](const difference_type off) const noexcept {
123 return *(*this + off);
124 }
125
131 NEFORCE_NODISCARD constexpr bool equal(const array_iterator& rhs) const noexcept {
132 NEFORCE_DEBUG_VERIFY(container_ == rhs.container_, "Attempting to equal to a different container");
133 return current_ == rhs.current_;
134 }
135
141 NEFORCE_NODISCARD constexpr bool less_than(const array_iterator& rhs) const noexcept {
142 NEFORCE_DEBUG_VERIFY(container_ == rhs.container_, "Attempting to less than a different container");
143 return current_ < rhs.current_;
144 }
145
150 NEFORCE_NODISCARD constexpr pointer base() const noexcept { return current_; }
151
156 NEFORCE_NODISCARD constexpr const container_type* container() const noexcept { return container_; }
157};
158
159
171template <typename T, size_t Size>
172class array : public icollector<array<T, Size>> {
173 static_assert(is_object_v<T>, "array only containers of object types.");
174
175public:
176 using value_type = T;
177 using pointer = T*;
178 using reference = T&;
179 using const_pointer = const T*;
180 using const_reference = const T&;
181 using size_type = size_t;
182 using difference_type = ptrdiff_t;
183
188
189private:
190 T array_[Size];
191
192public:
193 constexpr array() noexcept = default;
194 NEFORCE_CONSTEXPR20 ~array() noexcept = default;
195
196 constexpr array(const array&) noexcept = default;
197 constexpr array& operator=(const array&) noexcept = default;
198 constexpr array(array&&) noexcept = default;
199 constexpr array& operator=(array&&) noexcept = default;
200
205 constexpr array(std::initializer_list<T> ilist) noexcept {
206 size_t size = ilist.size() < Size ? ilist.size() : Size;
207 _NEFORCE copy(ilist.begin(), ilist.begin() + size, array_);
208 }
209
214 NEFORCE_NODISCARD constexpr iterator begin() noexcept { return iterator(array_, this); }
215
220 NEFORCE_NODISCARD constexpr iterator end() noexcept { return iterator(array_ + Size, this); }
221
226 NEFORCE_NODISCARD constexpr const_iterator begin() const noexcept { return const_iterator(array_, this); }
227
232 NEFORCE_NODISCARD constexpr const_iterator end() const noexcept { return const_iterator(array_ + Size, this); }
233
238 NEFORCE_NODISCARD constexpr reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
239
244 NEFORCE_NODISCARD constexpr reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
245
250 NEFORCE_NODISCARD constexpr const_reverse_iterator rbegin() const noexcept { return const_reverse_iterator(end()); }
251
256 NEFORCE_NODISCARD constexpr const_reverse_iterator rend() const noexcept { return const_reverse_iterator(begin()); }
257
262 NEFORCE_NODISCARD constexpr const_iterator cbegin() const noexcept { return const_iterator(array_, this); }
263
268 NEFORCE_NODISCARD constexpr const_iterator cend() const noexcept { return const_iterator(array_ + Size, this); }
269
274 NEFORCE_NODISCARD constexpr const_reverse_iterator crbegin() const noexcept { return reverse_iterator(cend()); }
275
280 NEFORCE_NODISCARD constexpr const_reverse_iterator crend() const noexcept { return reverse_iterator(cbegin()); }
281
286 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr size_type size() const noexcept {
287 return Size;
288 }
289
294 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr size_type max_size() const noexcept {
295 return Size;
296 }
297
302 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr bool empty() const noexcept {
303 return false;
304 }
305
311 NEFORCE_NODISCARD constexpr reference at(size_type position) noexcept {
312 NEFORCE_DEBUG_VERIFY(position < Size, "array subscript out of range");
313 return array_[position];
314 }
315
320 NEFORCE_NODISCARD constexpr const_reference at(size_type position) const noexcept {
321 NEFORCE_DEBUG_VERIFY(position < Size, "array subscript out of range");
322 return array_[position];
323 }
324
329 NEFORCE_NODISCARD constexpr reference operator[](size_type position) noexcept {
330 NEFORCE_DEBUG_VERIFY(position < Size, "array subscript out of range");
331 return array_[position];
332 }
333
338 NEFORCE_NODISCARD constexpr const_reference operator[](size_type position) const noexcept {
339 NEFORCE_DEBUG_VERIFY(position < Size, "array subscript out of range");
340 return array_[position];
341 }
342
347 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reference front() noexcept { return array_[0]; }
352 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_reference front() const noexcept { return array_[0]; }
357 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reference back() noexcept { return array_[Size - 1]; }
362 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_reference back() const noexcept { return array_[Size - 1]; }
367 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr T* data() noexcept { return array_; }
372 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr const T* data() const noexcept {
373 return array_;
374 }
375
380 constexpr void fill(const T& value) { _NEFORCE fill_n(array_, Size, value); }
381
386 constexpr void swap(array& other) noexcept(is_nothrow_swappable_v<T>) { _NEFORCE swap(array_, other.array_); }
387
393 NEFORCE_NODISCARD constexpr bool operator==(const array& rhs) const noexcept {
394 return _NEFORCE equal(this->cbegin(), this->cend(), rhs.cbegin());
395 }
396
401 NEFORCE_NODISCARD constexpr bool operator<(const array& rhs) const noexcept {
402 return _NEFORCE lexicographical_compare(this->cbegin(), this->cend(), rhs.cbegin(), rhs.cend());
403 }
404};
405
406struct empty_array_element_tag {
407 constexpr explicit empty_array_element_tag() noexcept = default;
408};
409
416template <typename T>
417class array<T, 0> : public icollector<array<T, 0>> {
418 static_assert(is_object_v<T>, "array only containers of object types.");
419
420public:
421 using value_type = T;
422 using pointer = T*;
423 using reference = T&;
424 using const_pointer = const T*;
425 using const_reference = const T&;
426 using size_type = size_t;
427 using difference_type = ptrdiff_t;
428
429 using iterator = array_iterator<false, 0, array>;
430 using const_iterator = array_iterator<true, 0, array>;
431 using reverse_iterator = _NEFORCE reverse_iterator<iterator>;
432 using const_reverse_iterator = _NEFORCE reverse_iterator<const_iterator>;
433
434private:
436 empty_array_element_tag>
437 array_[1]{};
438
439public:
440 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr iterator begin() noexcept {
441 return iterator{};
442 }
443 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr iterator end() noexcept {
444 return iterator{};
445 }
446 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr const_iterator begin() const noexcept {
447 return const_iterator{};
448 }
449 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr const_iterator end() const noexcept {
450 return const_iterator{};
451 }
452 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr reverse_iterator rbegin() noexcept {
453 return reverse_iterator(end());
454 }
455 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr reverse_iterator rend() noexcept {
456 return reverse_iterator(begin());
457 }
458 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr const_reverse_iterator
459 rbegin() const noexcept {
460 return const_reverse_iterator(end());
461 }
462 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr const_reverse_iterator
463 rend() const noexcept {
464 return const_reverse_iterator(begin());
465 }
466 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_iterator cbegin() const noexcept { return begin(); }
467 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_iterator cend() const noexcept { return end(); }
468 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_reverse_iterator crbegin() const noexcept {
469 return rbegin();
470 }
471 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_reverse_iterator crend() const noexcept { return rend(); }
472
473 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr size_type size() const noexcept {
474 return 0;
475 }
476 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr size_type max_size() const noexcept {
477 return 0;
478 }
479 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr bool empty() const noexcept {
480 return true;
481 }
482
483 NEFORCE_NODISCARD reference at(size_type) {
484 NEFORCE_THROW_EXCEPTION(iterator_exception("array empty."));
485 return array_[0];
486 }
487
488 NEFORCE_NODISCARD const_reference at(size_type) const {
489 NEFORCE_THROW_EXCEPTION(iterator_exception("array empty."));
490 return array_[0];
491 }
492
493 NEFORCE_NODISCARD reference operator[](size_type) noexcept {
494 NEFORCE_THROW_EXCEPTION(iterator_exception("array index out of range"));
495 return *data();
496 }
497 NEFORCE_NODISCARD const_reference operator[](size_type) const noexcept {
498 NEFORCE_THROW_EXCEPTION(iterator_exception("array index out of range"));
499 return *data();
500 }
501
502 NEFORCE_NODISCARD reference front() noexcept {
503 NEFORCE_THROW_EXCEPTION(iterator_exception("array empty."));
504 return *data();
505 }
506 NEFORCE_NODISCARD const_reference front() const noexcept {
507 NEFORCE_THROW_EXCEPTION(iterator_exception("array empty."));
508 return *data();
509 }
510
511 NEFORCE_NODISCARD reference back() noexcept {
512 NEFORCE_THROW_EXCEPTION(iterator_exception("array empty."));
513 return *data();
514 }
515
516 NEFORCE_NODISCARD const_reference back() const noexcept {
517 NEFORCE_THROW_EXCEPTION(iterator_exception("array empty."));
518 return *data();
519 }
520
521 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr T* data() noexcept { return nullptr; }
522 NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr const T* data() const noexcept {
523 return nullptr;
524 }
525
526 NEFORCE_ALWAYS_INLINE constexpr void fill(const T&) {}
527 NEFORCE_ALWAYS_INLINE constexpr void swap(array&) noexcept {}
528
529 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr bool operator==(const array&) const noexcept { return true; }
530
531 NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr bool operator<(const array&) const noexcept { return false; }
532};
533
534#ifdef NEFORCE_STANDARD_17
535NEFORCE_BEGIN_INNER__
536template <typename First, typename... Rest>
537struct __array_same {
538 static_assert(conjunction_v<is_same<First, Rest>...>, "array types mismatch.");
539 using type = First;
540};
541NEFORCE_END_INNER__
542
543template <typename First, typename... Rest>
544array(First, Rest...) -> array<typename inner::__array_same<First, Rest...>::type, 1 + sizeof...(Rest)>;
545#endif
546
547
556template <size_t Idx, typename T, size_t Size>
557NEFORCE_NODISCARD constexpr T& get(array<T, Size>& arr) noexcept {
558 static_assert(Idx < Size, "array index out of bounds");
559 return arr[Idx];
560}
561
570template <size_t Idx, typename T, size_t Size>
571NEFORCE_NODISCARD constexpr const T& get(const array<T, Size>& arr) noexcept {
572 static_assert(Idx < Size, "array index out of bounds");
573 return arr[Idx];
574}
575
584template <size_t Idx, typename T, size_t Size>
585NEFORCE_NODISCARD constexpr T&& get(array<T, Size>&& arr) noexcept {
586 static_assert(Idx < Size, "array index out of bounds");
587 return _NEFORCE move(arr[Idx]);
588}
589
598template <size_t Idx, typename T, size_t Size>
599NEFORCE_NODISCARD constexpr const T&& get(const array<T, Size>&& arr) noexcept {
600 static_assert(Idx < Size, "array index out of bounds");
601 return _NEFORCE move(arr[Idx]);
602}
603 // Array
605
611
618template <typename T, size_t Size>
619struct tuple_size<array<T, Size>> : integral_constant<size_t, Size> {};
620
627template <size_t Idx, typename T, size_t Size>
628struct tuple_element<Idx, array<T, Size>> {
629 static_assert(Idx < Size, "array index is in range");
630 using type = T;
631};
632
633template <typename T, size_t Size>
634NEFORCE_INLINE17 constexpr size_t tuple_size_v<array<T, Size>> = Size;
635
636template <typename T, size_t Size>
637NEFORCE_INLINE17 constexpr size_t tuple_size_v<const array<T, Size>> = Size;
638 // Tuple
640
641NEFORCE_END_NAMESPACE__
642#endif // NEFORCE_CORE_CONTAINER_ARRAY_HPP__
固定大小数组容器
NEFORCE_NODISCARD constexpr const_reverse_iterator rend() const noexcept
获取常量反向结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_reference front() const noexcept
访问第一个常量元素
NEFORCE_NODISCARD constexpr const_reference operator[](size_type position) const noexcept
常量下标访问操作符
_NEFORCE reverse_iterator< iterator > reverse_iterator
反向迭代器类型
array_iterator< false, Size, array > iterator
迭代器类型
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr const_reference back() const noexcept
访问最后一个常量元素
NEFORCE_NODISCARD constexpr iterator end() noexcept
获取结束迭代器
NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr size_type max_size() const noexcept
获取最大大小
NEFORCE_NODISCARD constexpr const_reference at(size_type position) const noexcept
索引位置元素常量访问
constexpr void fill(const T &value)
填充数组
NEFORCE_NODISCARD constexpr const_iterator cend() const noexcept
获取常量结束迭代器
NEFORCE_NODISCARD constexpr const_iterator begin() const noexcept
获取常量起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reference front() noexcept
访问第一个元素
NEFORCE_NODISCARD constexpr const_reverse_iterator crend() const noexcept
获取常量反向结束迭代器
NEFORCE_NODISCARD constexpr reverse_iterator rbegin() noexcept
获取反向起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr reference back() noexcept
访问最后一个元素
NEFORCE_NODISCARD constexpr iterator begin() noexcept
获取起始迭代器
NEFORCE_NODISCARD constexpr const_reverse_iterator rbegin() const noexcept
获取常量反向起始迭代器
NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr size_type size() const noexcept
NEFORCE_NODISCARD constexpr reverse_iterator rend() noexcept
获取反向结束迭代器
NEFORCE_NODISCARD constexpr const_reverse_iterator crbegin() const noexcept
获取常量反向起始迭代器
NEFORCE_NODISCARD constexpr bool operator==(const array &rhs) const noexcept
相等比较操作符
NEFORCE_NODISCARD constexpr const_iterator end() const noexcept
获取常量结束迭代器
array_iterator< true, Size, array > const_iterator
常量迭代器类型
_NEFORCE reverse_iterator< const_iterator > const_reverse_iterator
常量反向迭代器类型
constexpr void swap(array &other) noexcept(is_nothrow_swappable_v< T >)
交换两个数组
NEFORCE_NODISCARD constexpr reference at(size_type position) noexcept
索引位置元素访问
NEFORCE_NODISCARD constexpr const_iterator cbegin() const noexcept
获取常量起始迭代器
NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr const T * data() const noexcept
获取常量底层数据指针
NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr bool empty() const noexcept
检查数组是否为空
NEFORCE_NODISCARD constexpr reference operator[](size_type position) noexcept
下标访问操作符
NEFORCE_NODISCARD constexpr bool operator<(const array &rhs) const noexcept
小于比较操作符
NEFORCE_NODISCARD NEFORCE_CONST_FUNCTION NEFORCE_ALWAYS_INLINE constexpr T * data() noexcept
获取底层数据指针
比较算法
NEFORCE_NODISCARD constexpr T & get(array< T, Size > &arr) noexcept
获取左值数组指定位置的元素
NEFORCE_INLINE17 constexpr bool is_object_v
is_object的便捷变量模板
NEFORCE_NODISCARD constexpr bool equal(Iterator1 first1, Iterator1 last1, Iterator2 first2, BinaryPredicate binary_pred) noexcept(noexcept(++first1) &&noexcept(++first2) &&noexcept(binary_pred(*first1, *first2)))
比较两个范围是否相等
NEFORCE_NODISCARD constexpr bool lexicographical_compare(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Compare comp) noexcept(noexcept(++first1) &&noexcept(++first2) &&noexcept(comp(*first1, *first2)) &&noexcept(first1==last1 &&first2 !=last2))
字典序比较两个范围
#define NEFORCE_DEBUG_VERIFY(CON, MESG)
调试模式断言
bool operator==(const function< Res(Args...)> &f, nullptr_t np) noexcept
等于空指针比较
NEFORCE_NODISCARD constexpr bool operator<(const normal_iterator< LeftIter > &lhs, const normal_iterator< RightIter > &rhs) noexcept
小于比较运算符
uint64_t size_t
无符号大小类型
int64_t ptrdiff_t
指针差类型
constexpr void fill(Iterator first, Iterator last, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充范围元素
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr Iterator2 copy(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__copy_aux(first, last, result)))
复制范围元素
constexpr Iterator fill_n(Iterator first, iter_difference_t< Iterator > n, const T &value) noexcept(is_nothrow_assignable_v< iter_value_t< Iterator >, T >)
填充指定数量的元素
void swap()=delete
删除无参数的swap重载
NEFORCE_INLINE17 constexpr bool is_nothrow_swappable_v
is_nothrow_swappable的便捷变量模板
constexpr size_t tuple_size_v
tuple_size的类型别名
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) rbegin(Container &cont) noexcept(noexcept(cont.rbegin()))
获取容器的反向起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) crend(const Container &cont) noexcept(noexcept(cont.crend()))
获取const容器的const反向结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) rend(Container &cont) noexcept(noexcept(cont.rend()))
获取const容器的反向起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) begin(Container &cont) noexcept(noexcept(cont.begin()))
获取容器的起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) end(Container &cont) noexcept(noexcept(cont.end()))
获取容器的结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr bool empty(const Container &cont) noexcept(noexcept(cont.empty()))
检查容器是否为空
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) cbegin(const Container &cont) noexcept(noexcept(cont.cbegin()))
获取const容器的const起始迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) cend(const Container &cont) noexcept(noexcept(cont.cend()))
获取const容器的const结束迭代器
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) crbegin(const Container &cont) noexcept(noexcept(cont.crbegin()))
获取const容器的const反向起始迭代器
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
NEFORCE_INLINE17 constexpr bool conjunction_v
conjunction的便捷变量模板
集合器接口
迭代器接口
移位和修改算法
数组迭代器
conditional_t< IsConst, typename container_type::const_pointer, typename container_type::pointer > pointer
指针类型
NEFORCE_NODISCARD constexpr bool equal(const array_iterator &rhs) const noexcept
相等比较
Array container_type
容器类型
NEFORCE_NODISCARD constexpr const container_type * container() const noexcept
获取关联容器
typename container_type::value_type value_type
值类型
typename container_type::difference_type difference_type
差值类型
NEFORCE_NODISCARD constexpr difference_type distance_to(const array_iterator &other) const noexcept
计算距离操作
constexpr void decrement() noexcept
递减操作
typename container_type::size_type size_type
大小类型
constexpr void advance(difference_type off) noexcept
前进操作
NEFORCE_NODISCARD constexpr reference operator[](const difference_type off) const noexcept
下标访问操作符
contiguous_iterator_tag iterator_category
迭代器类别
constexpr void increment() noexcept
递增操作
NEFORCE_NODISCARD constexpr bool less_than(const array_iterator &rhs) const noexcept
小于比较
NEFORCE_NODISCARD constexpr reference dereference() const noexcept
解引用操作
conditional_t< IsConst, typename container_type::const_reference, typename container_type::reference > reference
引用类型
NEFORCE_NODISCARD constexpr pointer base() const noexcept
获取底层指针
连续迭代器标签
集合器接口模板
迭代器接口模板
整数常量包装器
判断类型是否可隐式默认构造
指针或迭代器行为异常
获取tuple元素类型的特化
获取tuple大小的特化