MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
reverse_iterator.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
2#define MSTL_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
3
10
13
19
28template <typename Iterator>
30 static_assert(is_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)
53 noexcept(is_nothrow_move_constructible_v<Iterator>)
54 : current(_MSTL move(x)) {}
55
63 template <typename U>
64#ifdef MSTL_STANDARD_20__
65 requires(!same_as<U, Iterator> && convertible_to<const U&, Iterator>)
66#endif // MSTL_STANDARD_20__
67 constexpr explicit reverse_iterator(const reverse_iterator<U>& x)
68 noexcept(is_nothrow_constructible_v<Iterator, const U&>)
69 : current(x.current) {}
70
77 template <typename U>
78#ifdef MSTL_STANDARD_20__
79 requires(!same_as<U, Iterator> && convertible_to<const U&, Iterator>
80 && assignable_from<Iterator&, const U&>)
81#endif // MSTL_STANDARD_20__
84 current = x.current;
85 return *this;
86 }
87
88 MSTL_CONSTEXPR20 ~reverse_iterator() noexcept = default;
89
96 MSTL_NODISCARD constexpr reference operator *() const
97 noexcept(is_nothrow_copy_assignable<Iterator>::value && noexcept(*--(_MSTL declval<Iterator&>()))) {
98 Iterator iter = current;
99 return *--iter;
100 }
101
108 MSTL_NODISCARD constexpr pointer operator ->() const
109 noexcept(is_nothrow_copy_constructible<Iterator>::value && noexcept(--(_MSTL declval<Iterator&>()))
110 && is_nothrow_arrow<Iterator&, pointer>::value)
111#ifdef MSTL_STANDARD_20__
112 requires (is_pointer_v<Iterator> || requires(const Iterator it) { it.operator->(); })
113#endif // MSTL_STANDARD_20__
114 {
115 Iterator tmp = current;
116 --tmp;
117 return _MSTL to_pointer(tmp);
118 }
119
127 noexcept(noexcept(--current)) {
128 --current;
129 return *this;
130 }
131
137 noexcept(is_nothrow_copy_constructible_v<Iterator> && noexcept(--current)) {
138 reverse_iterator tmp = *this;
139 --current;
140 return tmp;
141 }
142
150 noexcept(noexcept(++current)) {
151 ++current;
152 return *this;
153 }
154
160 noexcept(is_nothrow_copy_constructible_v<Iterator> && noexcept(++current)) {
161 reverse_iterator tmp = *this;
162 ++current;
163 return tmp;
164 }
165
174 noexcept(noexcept(reverse_iterator(current - n))) {
175 return reverse_iterator(current - n);
176 }
177
184 noexcept(noexcept(current -= n)) {
185 current -= n;
186 return *this;
187 }
188
197 noexcept(noexcept(reverse_iterator(current + n))) {
198 return reverse_iterator(current + n);
199 }
200
207 noexcept(noexcept(current += n)) {
208 current += n;
209 return *this;
210 }
211
217 constexpr reference operator [](const difference_type n) const
218 noexcept(noexcept(_MSTL declcopy<reference>(reverse_iterator(current - n)))) {
219 return *(*this + n);
220 }
221
226 MSTL_NODISCARD constexpr const Iterator& base() const noexcept {
227 return current;
228 }
229};
230
239template <typename Iterator1, typename Iterator2>
240MSTL_NODISCARD constexpr bool operator ==(
242 noexcept(noexcept(_MSTL declcopy<bool>(x.base() == y.base())))
244 requires requires { { x.base() == y.base() } -> convertible_to<bool>; }
245#endif // MSTL_STANDARD_20__
246{
247 return x.base() == y.base();
248}
249
258template <typename Iterator1, typename Iterator2>
259MSTL_NODISCARD constexpr bool operator !=(
261 noexcept(noexcept(_MSTL declcopy<bool>(x.base() != y.base())))
263 requires requires { { x.base() != y.base() } -> convertible_to<bool>; }
264#endif // MSTL_STANDARD_20__
265{
266 return x.base() != y.base();
267}
268
278template <typename Iterator1, typename Iterator2>
279MSTL_NODISCARD constexpr bool operator <(
281 noexcept(noexcept(_MSTL declcopy<bool>(x.base() > y.base())))
283 requires requires { { x.base() > y.base() } -> convertible_to<bool>; }
284#endif
285{
286 return x.base() > y.base();
287}
288
297template <typename Iterator1, typename Iterator2>
298MSTL_NODISCARD constexpr bool operator >(
300 noexcept(noexcept(_MSTL declcopy<bool>(x.base() < y.base())))
302 requires requires { { x.base() < y.base() } -> convertible_to<bool>; }
303#endif // MSTL_STANDARD_20__
304{
305 return x.base() < y.base();
306}
307
316template <typename Iterator1, typename Iterator2>
317MSTL_NODISCARD constexpr bool operator <=(
319 noexcept(noexcept(_MSTL declcopy<bool>(x.base() >= y.base())))
321 requires requires { { x.base() >= y.base() } -> convertible_to<bool>; }
322#endif // MSTL_STANDARD_20__
323{
324 return x.base() >= y.base();
325}
326
335template <typename Iterator1, typename Iterator2>
336MSTL_NODISCARD constexpr bool operator >=(
338 noexcept(noexcept(_MSTL declcopy<bool>(x.base() <= y.base())))
340 requires requires { { x.base() <= y.base() } -> convertible_to<bool>; }
341#endif // MSTL_STANDARD_20__
342{
343 return x.base() <= y.base();
344}
345
355template <typename Iterator1, typename Iterator2>
356MSTL_NODISCARD constexpr decltype(auto) operator -(
358 noexcept(noexcept(y.base() - x.base())) {
359 return y.base() - x.base();
360}
361
369template <typename Iterator>
372 noexcept(noexcept(x + n)) {
373 return x + n;
374}
375
382template <typename Iterator>
383MSTL_NODISCARD constexpr reverse_iterator<Iterator>
384make_reverse_iterator(Iterator it) noexcept(is_nothrow_move_constructible_v<Iterator>) {
386}
387 // ReverseIterator
389
391#endif // MSTL_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
反向迭代器模板类
constexpr reverse_iterator()=default
默认构造函数
MSTL_NODISCARD constexpr pointer operator->() const noexcept(is_nothrow_copy_constructible< Iterator >::value &&noexcept(--(_MSTL declval< Iterator & >())) &&is_nothrow_arrow< Iterator &, pointer >::value)
成员访问运算符
constexpr reverse_iterator & operator+=(const difference_type n) noexcept(noexcept(current -=n))
复合加法赋值运算符
constexpr reverse_iterator operator+(const difference_type n) const noexcept(noexcept(reverse_iterator(current - n)))
加法运算符
constexpr reverse_iterator(const reverse_iterator< U > &x) noexcept(is_nothrow_constructible_v< Iterator, const U & >)
从其他类型的反向迭代器构造
iter_reference_t< Iterator > reference
引用类型
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) noexcept(noexcept(current+=n))
复合减法赋值运算符
iter_difference_t< Iterator > difference_type
差值类型
constexpr reverse_iterator & operator++() noexcept(noexcept(--current))
前缀递增运算符
iter_pointer_t< Iterator > pointer
指针类型
MSTL_NODISCARD constexpr const Iterator & base() const noexcept
获取底层迭代器
constexpr reverse_iterator & operator--() noexcept(noexcept(++current))
前缀递减运算符
iter_value_t< Iterator > value_type
值类型
constexpr reverse_iterator(Iterator x) noexcept(is_nothrow_move_constructible_v< Iterator >)
从底层迭代器构造
iter_category_t< Iterator > iterator_category
迭代器类别
MSTL_CONSTEXPR20 ~reverse_iterator() noexcept=default
析构函数
constexpr reverse_iterator operator-(const difference_type n) const noexcept(noexcept(reverse_iterator(current+n)))
减法运算符
constexpr reference operator[](const difference_type n) const noexcept(noexcept(_MSTL declcopy< reference >(reverse_iterator(current - n))))
下标运算符
检查类型From是否可以转换为类型To
#define MSTL_STANDARD_20__
使用C++20或更高标准编译
type_identity_t< T > declcopy(type_identity_t< T >) noexcept
获取类型的副本,仅用于非求值上下文
add_rvalue_reference_t< T > declval() noexcept
获取类型的右值引用,仅用于非求值上下文
MSTL_INLINE17 constexpr bool is_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
获取迭代器的指针类型
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr reverse_iterator< Iterator > operator+(iter_difference_t< Iterator > n, const reverse_iterator< Iterator > &x) noexcept(noexcept(x+n))
与整数相加的运算符
MSTL_NODISCARD constexpr bool operator>=(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base()<=y.base())))
大于等于比较运算符
MSTL_NODISCARD constexpr bool operator>(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base()< y.base())))
大于比较运算符
MSTL_NODISCARD constexpr bool operator<=(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base() >=y.base())))
小于等于比较运算符
MSTL_NODISCARD constexpr reverse_iterator< Iterator > make_reverse_iterator(Iterator it) noexcept(is_nothrow_move_constructible_v< Iterator >)
创建反向迭代器
MSTL_NODISCARD constexpr bool operator==(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base()==y.base())))
相等比较运算符
MSTL_NODISCARD constexpr bool operator<(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base() > y.base())))
小于比较运算符
MSTL_NODISCARD constexpr bool operator!=(const reverse_iterator< Iterator1 > &x, const reverse_iterator< Iterator2 > &y) noexcept(noexcept(_MSTL declcopy< bool >(x.base() !=y.base())))
不等比较运算符
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
MSTL迭代器操作算法
判断迭代器的箭头运算符是否不会抛出异常
判断类型是否可以使用指定类型的值进行无异常赋值
判断类型是否可无异常复制赋值
判断类型是否可无异常复制构造