1#ifndef MSTL_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
2#define MSTL_CORE_ITERATOR_REVERSE_ITERATOR_HPP__
28template <
typename Iterator>
53 noexcept(is_nothrow_move_constructible_v<Iterator>)
64#ifdef MSTL_STANDARD_20__
68 noexcept(is_nothrow_constructible_v<Iterator, const U&>)
69 : current(x.current) {}
78#ifdef MSTL_STANDARD_20__
80 && assignable_from<Iterator&, const U&>)
96 MSTL_NODISCARD constexpr
reference operator *() const
98 Iterator iter = current;
111#ifdef MSTL_STANDARD_20__
112 requires (is_pointer_v<Iterator> ||
requires(
const Iterator it) { it.operator->(); })
115 Iterator tmp = current;
127 noexcept(noexcept(--current)) {
137 noexcept(is_nothrow_copy_constructible_v<Iterator> &&
noexcept(--current)) {
150 noexcept(noexcept(++current)) {
160 noexcept(is_nothrow_copy_constructible_v<Iterator> &&
noexcept(++current)) {
184 noexcept(
noexcept(current -= n)) {
207 noexcept(
noexcept(current += n)) {
226 MSTL_NODISCARD
constexpr const Iterator&
base() const noexcept {
239template <
typename Iterator1,
typename Iterator2>
247 return x.base() == y.base();
258template <
typename Iterator1,
typename Iterator2>
266 return x.base() != y.base();
278template <
typename Iterator1,
typename Iterator2>
286 return x.base() > y.base();
297template <
typename Iterator1,
typename Iterator2>
305 return x.base() < y.base();
316template <
typename Iterator1,
typename Iterator2>
324 return x.base() >= y.base();
335template <
typename Iterator1,
typename Iterator2>
343 return x.base() <= y.base();
355template <
typename Iterator1,
typename Iterator2>
356MSTL_NODISCARD
constexpr decltype(
auto)
operator -(
358 noexcept(
noexcept(y.base() - x.base())) {
359 return y.base() - x.base();
369template <
typename Iterator>
372 noexcept(
noexcept(x + n)) {
382template <
typename Iterator>
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))))
下标运算符
#define MSTL_STANDARD_20__
使用C++20或更高标准编译
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)
移动范围元素