MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
iterator.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ALGORITHM_ITERATOR_HPP__
2#define MSTL_CORE_ALGORITHM_ITERATOR_HPP__
3
11
14
20
21#ifndef MSTL_STANDARD_17__
24template <typename Ptr, enable_if_t<is_pointer_v<Ptr>, int> = 0>
25constexpr iter_pointer_t<Ptr> __to_pointer_aux(Ptr iter) {
26 return iter;
27}
28template <typename Iterator, enable_if_t<!is_pointer_v<Iterator>, int> = 0>
29constexpr iter_pointer_t<Iterator> __to_pointer_aux(Iterator iter) {
30 return iter.operator->();
31}
34#endif // MSTL_STANDARD_17__
35
42template <typename Iterator>
43constexpr iter_pointer_t<Iterator> to_pointer(Iterator iter) {
44#ifdef MSTL_STANDARD_17__
45 if constexpr (is_pointer_v<Iterator>) {
46 return iter;
47 } else {
48 return iter.operator ->();
49 }
50#else
51 return _INNER __to_pointer_aux(iter);
52#endif
53}
54
55
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) {
61 i += n;
62}
63template <typename Iterator, typename Distance, enable_if_t<!is_rnd_iter_v<Iterator> && is_ranges_bid_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;
67}
68template <typename Iterator, typename Distance, enable_if_t<!is_rnd_iter_v<Iterator> && !is_ranges_bid_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;
72}
75#endif // MSTL_STANDARD_17__
76
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__
92 if constexpr (is_rnd_iter_v<Iterator>) {
93 i += n;
94 } else {
95 if constexpr (is_signed_v<Distance> && !is_bid_iter_v<Iterator>) {
96 MSTL_DEBUG_VERIFY(n >= 0, "negative advance of non-bidirectional iterator");
97 }
98 if constexpr (is_signed_v<Distance> && is_bid_iter_v<Iterator>) {
99 for (; n < 0; ++n) --i;
100 }
101 for (; 0 < n; --n) ++i;
102 }
103#else
104 _INNER __advance_aux(i, n);
105#endif
106}
107
117template <typename Iterator>
118constexpr Iterator prev(Iterator iter, iter_difference_t<Iterator> n = -1) {
119 MSTL_DEBUG_VERIFY(n <= 0, "negative advance in previous operation function.");
120 _MSTL advance(iter, n);
121 return iter;
122}
123
133template <typename Iterator>
134constexpr Iterator next(Iterator iter, iter_difference_t<Iterator> n = 1) {
135 MSTL_DEBUG_VERIFY(n >= 0, "positive advance in next operation function.");
136 _MSTL advance(iter, n);
137 return iter;
138}
139
140
141#ifndef MSTL_STANDARD_17__
144template <typename Iterator, enable_if_t<is_rnd_iter_v<Iterator>, int> = 0>
145constexpr iter_difference_t<Iterator> __distance_aux(Iterator first, Iterator last) {
146 return last - first;
147}
148template <typename Iterator, enable_if_t<!is_rnd_iter_v<Iterator>, int> = 0>
149constexpr iter_difference_t<Iterator> __distance_aux(Iterator first, Iterator last) {
151 while (first != last) { ++first; ++n; }
152 return n;
153}
156#endif // MSTL_STANDARD_17__
157
169template <typename Iterator, enable_if_t<is_iter_v<Iterator>, int> = 0>
170constexpr iter_difference_t<Iterator> distance(Iterator first, Iterator last) {
171#ifdef MSTL_STANDARD_17__
172 if constexpr (is_rnd_iter_v<Iterator>) {
173 return last - first;
174 } else {
176 while (first != last) { ++first; ++n; }
177 return n;
178 }
179#else
180 return _INNER __distance_aux(first, last);
181#endif
182}
183 // IteratorOperation
185
187#endif // MSTL_CORE_ALGORITHM_ITERATOR_HPP__
MSTL概念和类型约束
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命名空间