NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
reverse_iterator.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
2#define NEFORCE_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
3
10
12NEFORCE_BEGIN_NAMESPACE__
13
19
28template <typename Iterator>
29class reverse_iterator {
30 static_assert(is_ranges_bid_iter_v<Iterator>, "reverse iterator requires bidirectional iterator.");
31
32public:
38
39private:
40 Iterator current;
41
42public:
46 constexpr reverse_iterator() = default;
47
52 constexpr explicit reverse_iterator(Iterator x) noexcept(is_nothrow_move_constructible_v<Iterator>) :
53 current(_NEFORCE move(x)) {}
54
62 template <typename U>
63#ifdef NEFORCE_STANDARD_20
65#endif // NEFORCE_STANDARD_20
66 constexpr explicit reverse_iterator(const reverse_iterator<U>& x) noexcept(
68 current(x.current) {
69 }
70
77 template <typename U>
78#ifdef NEFORCE_STANDARD_20
80#endif // NEFORCE_STANDARD_20
81 constexpr reverse_iterator&
83 current = x.current;
84 return *this;
85 }
86
87 NEFORCE_CONSTEXPR20 ~reverse_iterator() noexcept = default;
88
95 NEFORCE_NODISCARD constexpr reference operator*() const
96 noexcept(is_nothrow_copy_assignable<Iterator>::value && noexcept(*--(_NEFORCE declval<Iterator&>()))) {
97 Iterator iter = current;
98 return *--iter;
99 }
100
107 NEFORCE_NODISCARD constexpr pointer operator->() const
108 noexcept(is_nothrow_copy_constructible<Iterator>::value && noexcept(--(_NEFORCE declval<Iterator&>())) &&
109 is_nothrow_arrow<Iterator&, pointer>::value)
110#ifdef NEFORCE_STANDARD_20
111 requires(is_pointer_v<Iterator> || requires(const Iterator it) { it.operator->(); })
112#endif // NEFORCE_STANDARD_20
113 {
114 Iterator tmp = current;
115 --tmp;
116 return _NEFORCE to_pointer(tmp);
117 }
118
125 constexpr reverse_iterator& operator++() noexcept(noexcept(--current)) {
126 --current;
127 return *this;
128 }
129
134 constexpr reverse_iterator operator++(int) noexcept(is_nothrow_copy_constructible_v<Iterator> &&
135 noexcept(--current)) {
136 reverse_iterator tmp = *this;
137 --current;
138 return tmp;
139 }
140
147 constexpr reverse_iterator& operator--() noexcept(noexcept(++current)) {
148 ++current;
149 return *this;
150 }
151
156 constexpr reverse_iterator operator--(int) noexcept(is_nothrow_copy_constructible_v<Iterator> &&
157 noexcept(++current)) {
158 reverse_iterator tmp = *this;
159 ++current;
160 return tmp;
161 }
162
170 constexpr reverse_iterator operator+(const difference_type n) const
171 noexcept(noexcept(reverse_iterator(current - n))) {
172 return reverse_iterator(current - n);
173 }
174
180 constexpr reverse_iterator& operator+=(const difference_type n) noexcept(noexcept(current -= n)) {
181 current -= n;
182 return *this;
183 }
184
192 constexpr reverse_iterator operator-(const difference_type n) const
193 noexcept(noexcept(reverse_iterator(current + n))) {
194 return reverse_iterator(current + n);
195 }
196
202 constexpr reverse_iterator& operator-=(const difference_type n) noexcept(noexcept(current += n)) {
203 current += n;
204 return *this;
205 }
206
212 constexpr reference operator[](const difference_type n) const
213 noexcept(noexcept(_NEFORCE declcopy<reference>(reverse_iterator(current - n)))) {
214 return *(*this + n);
215 }
216
221 NEFORCE_NODISCARD constexpr const Iterator& base() const noexcept { return current; }
222};
223
232template <typename Iterator1, typename Iterator2>
233NEFORCE_NODISCARD constexpr bool
235 const reverse_iterator<Iterator2>& y) noexcept(noexcept(_NEFORCE declcopy<bool>(x.base() == y.base())))
237 requires requires {
238 { x.base() == y.base() } -> convertible_to<bool>;
239 }
240#endif // NEFORCE_STANDARD_20
241{
242 return x.base() == y.base();
243}
244
253template <typename Iterator1, typename Iterator2>
254NEFORCE_NODISCARD constexpr bool
256 const reverse_iterator<Iterator2>& y) noexcept(noexcept(_NEFORCE declcopy<bool>(x.base() != y.base())))
258 requires requires {
259 { x.base() != y.base() } -> convertible_to<bool>;
260 }
261#endif // NEFORCE_STANDARD_20
262{
263 return x.base() != y.base();
264}
265
275template <typename Iterator1, typename Iterator2>
276NEFORCE_NODISCARD constexpr bool
278 const reverse_iterator<Iterator2>& y) noexcept(noexcept(_NEFORCE declcopy<bool>(x.base() > y.base())))
280 requires requires {
281 { x.base() > y.base() } -> convertible_to<bool>;
282 }
283#endif
284{
285 return x.base() > y.base();
286}
287
296template <typename Iterator1, typename Iterator2>
297NEFORCE_NODISCARD constexpr bool
299 const reverse_iterator<Iterator2>& y) noexcept(noexcept(_NEFORCE declcopy<bool>(x.base() < y.base())))
301 requires requires {
302 { x.base() < y.base() } -> convertible_to<bool>;
303 }
304#endif // NEFORCE_STANDARD_20
305{
306 return x.base() < y.base();
307}
308
317template <typename Iterator1, typename Iterator2>
318NEFORCE_NODISCARD constexpr bool
320 const reverse_iterator<Iterator2>& y) noexcept(noexcept(_NEFORCE declcopy<bool>(x.base() >= y.base())))
322 requires requires {
323 { x.base() >= y.base() } -> convertible_to<bool>;
324 }
325#endif // NEFORCE_STANDARD_20
326{
327 return x.base() >= y.base();
328}
329
338template <typename Iterator1, typename Iterator2>
339NEFORCE_NODISCARD constexpr bool
341 const reverse_iterator<Iterator2>& y) noexcept(noexcept(_NEFORCE declcopy<bool>(x.base() <= y.base())))
343 requires requires {
344 { x.base() <= y.base() } -> convertible_to<bool>;
345 }
346#endif // NEFORCE_STANDARD_20
347{
348 return x.base() <= y.base();
349}
350
360template <typename Iterator1, typename Iterator2>
361NEFORCE_NODISCARD constexpr decltype(auto)
363 const reverse_iterator<Iterator2>& y) noexcept(noexcept(y.base() - x.base())) {
364 return y.base() - x.base();
365}
366
374template <typename Iterator>
376 const reverse_iterator<Iterator>& x) noexcept(noexcept(x + n)) {
377 return x + n;
378}
379
386template <typename Iterator>
387NEFORCE_NODISCARD constexpr reverse_iterator<Iterator>
391 // ReverseIterator
393
394NEFORCE_END_NAMESPACE__
395#endif // NEFORCE_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
反向迭代器模板类
constexpr reverse_iterator operator-(const difference_type n) const noexcept(noexcept(reverse_iterator(current+n)))
减法运算符
iter_category_t< Iterator > iterator_category
constexpr reverse_iterator()=default
默认构造函数
constexpr reverse_iterator(Iterator x) noexcept(is_nothrow_move_constructible_v< Iterator >)
从底层迭代器构造
constexpr reverse_iterator(const reverse_iterator< U > &x) noexcept(is_nothrow_constructible_v< Iterator, const U & >)
从其他类型的反向迭代器构造
constexpr reverse_iterator operator--(int) noexcept(is_nothrow_copy_constructible_v< Iterator > &&noexcept(++current))
后缀递减运算符
iter_reference_t< Iterator > reference
constexpr reverse_iterator & operator+=(const difference_type n) noexcept(noexcept(current -=n))
复合加法赋值运算符
constexpr reverse_iterator & operator++() noexcept(noexcept(--current))
前缀递增运算符
constexpr reverse_iterator & operator-=(const difference_type n) noexcept(noexcept(current+=n))
复合减法赋值运算符
iter_difference_t< Iterator > difference_type
NEFORCE_CONSTEXPR20 ~reverse_iterator() noexcept=default
析构函数
constexpr reverse_iterator operator++(int) noexcept(is_nothrow_copy_constructible_v< Iterator > &&noexcept(--current))
后缀递增运算符
NEFORCE_NODISCARD constexpr const Iterator & base() const noexcept
获取底层迭代器
constexpr reverse_iterator & operator=(const reverse_iterator< U > &x) noexcept(is_nothrow_assignable< reverse_iterator &, const U & >::value)
从其他类型的反向迭代器赋值
constexpr reverse_iterator operator+(const difference_type n) const noexcept(noexcept(reverse_iterator(current - n)))
加法运算符
NEFORCE_NODISCARD constexpr pointer operator->() const noexcept(is_nothrow_copy_constructible< Iterator >::value &&noexcept(--(_NEFORCE declval< Iterator & >())) &&is_nothrow_arrow< Iterator &, pointer >::value)
成员访问运算符
constexpr reference operator[](const difference_type n) const noexcept(noexcept(_NEFORCE declcopy< reference >(reverse_iterator(current - n))))
下标运算符
constexpr reverse_iterator & operator--() noexcept(noexcept(++current))
前缀递减运算符
检查类型是否可以从另一个类型赋值
检查类型From是否可以转换为类型To
检查两个类型是否完全相同
NEFORCE_INLINE17 constexpr bool is_pointer_v
is_pointer的便捷变量模板
#define NEFORCE_STANDARD_20
使用C++20或更高标准编译
type_identity_t< T > declcopy(type_identity_t< T >) noexcept
获取类型的副本,仅用于非求值上下文
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
NEFORCE_INLINE17 constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
constexpr iter_pointer_t< Iterator > to_pointer(Iterator iter)
将迭代器转换为原始指针
typename iterator_traits< Iterator >::reference iter_reference_t
获取迭代器的引用类型
typename iterator_traits< Iterator >::iterator_category iter_category_t
获取迭代器的类别标签
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
typename iterator_traits< Iterator >::pointer iter_pointer_t
获取迭代器的指针类型
NEFORCE_NODISCARD constexpr bool operator>(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_NEFORCE declcopy< bool >(x.base()< y.base())))
大于比较运算符
NEFORCE_NODISCARD constexpr bool operator!=(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_NEFORCE declcopy< bool >(x.base() !=y.base())))
不等比较运算符
constexpr reverse_iterator< Iterator > operator+(iter_difference_t< Iterator > n, const reverse_iterator< Iterator > &x) noexcept(noexcept(x+n))
与整数相加的运算符
NEFORCE_NODISCARD constexpr bool operator==(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_NEFORCE declcopy< bool >(x.base()==y.base())))
相等比较运算符
NEFORCE_NODISCARD constexpr bool operator>=(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_NEFORCE declcopy< bool >(x.base()<=y.base())))
大于等于比较运算符
NEFORCE_NODISCARD constexpr bool operator<=(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_NEFORCE declcopy< bool >(x.base() >=y.base())))
小于等于比较运算符
NEFORCE_NODISCARD constexpr bool operator<(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_NEFORCE declcopy< bool >(x.base() > y.base())))
小于比较运算符
NEFORCE_NODISCARD constexpr reverse_iterator< Iterator > make_reverse_iterator(Iterator it) noexcept(is_nothrow_move_constructible_v< Iterator >)
创建反向迭代器
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_INLINE17 constexpr bool is_nothrow_constructible_v
is_nothrow_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_move_constructible_v
is_nothrow_move_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_nothrow_copy_constructible_v
is_nothrow_copy_constructible的便捷变量模板
迭代器操作算法
判断迭代器的箭头运算符是否不会抛出异常
判断类型是否可以使用指定类型的值进行无异常赋值
判断类型是否可无异常复制赋值
判断类型是否可无异常复制构造