1#ifndef MSTL_CORE_ALGORITHM_ITERATOR_HPP__
2#define MSTL_CORE_ALGORITHM_ITERATOR_HPP__
21#ifndef MSTL_STANDARD_17__
24template <
typename Ptr, enable_if_t<is_po
inter_v<Ptr>,
int> = 0>
28template <
typename Iterator, enable_if_t<!is_po
inter_v<Iterator>,
int> = 0>
30 return iter.operator->();
42template <
typename Iterator>
44#ifdef MSTL_STANDARD_17__
45 if constexpr (is_pointer_v<Iterator>) {
48 return iter.operator ->();
51 return _INNER __to_pointer_aux(iter);
56#ifndef MSTL_STANDARD_17__
59template <
typename Iterator,
typename Distance, enable_if_t<is_rnd_iter_v<Iterator>,
int> = 0>
60constexpr void __advance_aux(Iterator& i, Distance n) {
63template <
typename Iterator,
typename Distance, enable_if_t<!is_rnd_iter_v<Iterator> && is_ranges_b
id_iter_v<Iterator>,
int> = 0>
64constexpr void __advance_aux(Iterator& i, Distance n) {
65 for (; n < 0; ++n) --i;
66 for (; 0 < n; --n) ++i;
68template <
typename Iterator,
typename Distance, enable_if_t<!is_rnd_iter_v<Iterator> && !is_ranges_b
id_iter_v<Iterator>,
int> = 0>
69constexpr void __advance_aux(Iterator& i, Distance n) {
70 MSTL_DEBUG_VERIFY__(is_signed_v<Distance> && n >= 0,
"negative advance of non-bidirectional iterator");
71 for (; 0 < n; --n) ++i;
89template <
typename Iterator,
typename Distance, enable_if_t<is_iter_v<Iterator>,
int> = 0>
90constexpr void advance(Iterator& i, Distance n) {
91#ifdef MSTL_STANDARD_17__
96 MSTL_DEBUG_VERIFY(n >= 0,
"negative advance of non-bidirectional iterator");
99 for (; n < 0; ++n) --i;
101 for (; 0 < n; --n) ++i;
104 _INNER __advance_aux(i, n);
117template <
typename Iterator>
119 MSTL_DEBUG_VERIFY(n <= 0,
"negative advance in previous operation function.");
133template <
typename Iterator>
135 MSTL_DEBUG_VERIFY(n >= 0,
"positive advance in next operation function.");
141#ifndef MSTL_STANDARD_17__
144template <
typename Iterator, enable_if_t<is_rnd_iter_v<Iterator>,
int> = 0>
148template <
typename Iterator, enable_if_t<!is_rnd_iter_v<Iterator>,
int> = 0>
151 while (first != last) { ++first; ++n; }
169template <
typename Iterator, enable_if_t<is_iter_v<Iterator>,
int> = 0>
171#ifdef MSTL_STANDARD_17__
176 while (first != last) { ++first; ++n; }
180 return _INNER __distance_aux(first, last);
MSTL_INLINE17 constexpr bool is_rnd_iter_v
检查是否为随机访问迭代器
MSTL_INLINE17 constexpr bool is_bid_iter_v
检查是否为双向迭代器
constexpr Iterator prev(Iterator iter, iter_difference_t< Iterator > n=-1)
获取迭代器的前一个位置
constexpr iter_pointer_t< Iterator > to_pointer(Iterator iter)
将迭代器转换为原始指针
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
constexpr void advance(Iterator &i, Distance n)
将迭代器前进指定距离
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
typename iterator_traits< Iterator >::pointer iter_pointer_t
获取迭代器的指针类型
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间