NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
iterator.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_ITERATOR_HPP__
2#define NEFORCE_CORE_ALGORITHM_ITERATOR_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
22#ifndef NEFORCE_STANDARD_17
24NEFORCE_BEGIN_INNER__
25
26template <typename Ptr>
27constexpr enable_if_t<is_pointer_v<Ptr>, iter_pointer_t<Ptr>> __to_pointer_aux(Ptr iter) {
28 return iter;
29}
30
31template <typename Iterator>
32constexpr enable_if_t<!is_pointer_v<Iterator>, iter_pointer_t<Iterator>> __to_pointer_aux(Iterator iter) {
33 return iter.operator->();
34}
35
36NEFORCE_END_INNER__
38#endif // NEFORCE_STANDARD_17
39
46template <typename Iterator>
47constexpr iter_pointer_t<Iterator> to_pointer(Iterator iter) {
48#ifdef NEFORCE_STANDARD_17
49 if constexpr (is_pointer_v<Iterator>) {
50 return iter;
51 } else {
52 return iter.operator->();
53 }
54#else
55 return inner::__to_pointer_aux(iter);
56#endif
57}
58
59
60#ifndef NEFORCE_STANDARD_17
62NEFORCE_BEGIN_INNER__
63
64template <typename Iterator, typename Distance>
65constexpr enable_if_t<is_rnd_iter_v<Iterator>> __advance_aux(Iterator& i, Distance n) {
66 i += n;
67}
68
69template <typename Iterator, typename Distance>
70constexpr enable_if_t<!is_rnd_iter_v<Iterator> && is_ranges_bid_iter_v<Iterator>> __advance_aux(Iterator& i,
71 Distance n) {
72 for (; n < 0; ++n) {
73 --i;
74 }
75 for (; 0 < n; --n) {
76 ++i;
77 }
78}
79
80template <typename Iterator, typename Distance>
81constexpr enable_if_t<!is_rnd_iter_v<Iterator> && !is_ranges_bid_iter_v<Iterator>> __advance_aux(Iterator& i,
82 Distance n) {
83 NEFORCE_DEBUG_VERIFY__(is_signed_v<Distance> && n >= 0, "negative advance of non-bidirectional iterator");
84 for (; 0 < n; --n) {
85 ++i;
86 }
87}
88
89NEFORCE_END_INNER__
91#endif // NEFORCE_STANDARD_17
92
105template <typename Iterator, typename Distance>
106constexpr void advance(Iterator& i, Distance n) {
107 static_assert(is_iter_v<Iterator>, "Iterator must be iterator");
108 static_assert(is_arithmetic_v<Distance>, "Distance must be arithmetic");
109
110#ifdef NEFORCE_STANDARD_17
111 if constexpr (is_rnd_iter_v<Iterator>) {
112 i += n;
113 } else {
115 NEFORCE_DEBUG_VERIFY(n >= 0, "negative advance of non-bidirectional iterator");
116 }
118 for (; n < 0; ++n) {
119 --i;
120 }
121 }
122 for (; 0 < n; --n) {
123 ++i;
124 }
125 }
126#else
127 inner::__advance_aux(i, n);
128#endif
129}
130
140template <typename Iterator>
141constexpr Iterator prev(Iterator iter, iter_difference_t<Iterator> n = -1) {
142 NEFORCE_DEBUG_VERIFY(n <= 0, "negative advance in previous operation function.");
143 _NEFORCE advance(iter, n);
144 return iter;
145}
146
156template <typename Iterator>
157constexpr Iterator next(Iterator iter, iter_difference_t<Iterator> n = 1) {
158 NEFORCE_DEBUG_VERIFY(n >= 0, "positive advance in next operation function.");
159 _NEFORCE advance(iter, n);
160 return iter;
161}
162
163
164#ifndef NEFORCE_STANDARD_17
166NEFORCE_BEGIN_INNER__
167
168template <typename Iterator>
169constexpr enable_if_t<is_rnd_iter_v<Iterator>, iter_difference_t<Iterator>> __distance_aux(Iterator first,
170 Iterator last) {
171 return last - first;
172}
173
174template <typename Iterator>
175constexpr enable_if_t<!is_rnd_iter_v<Iterator>, iter_difference_t<Iterator>> __distance_aux(Iterator first,
176 Iterator last) {
178 while (first != last) {
179 ++first;
180 ++n;
181 }
182 return n;
183}
184
185NEFORCE_END_INNER__
187#endif // NEFORCE_STANDARD_17
188
200template <typename Iterator>
201constexpr iter_difference_t<Iterator> distance(Iterator first, Iterator last) {
202 static_assert(is_iter_v<Iterator>, "Iterator must be iterator");
203
204#ifdef NEFORCE_STANDARD_17
205 if constexpr (is_ranges_rnd_iter_v<Iterator>) {
206 return last - first;
207 } else {
209 while (first != last) {
210 ++first;
211 ++n;
212 }
213 return n;
214 }
215#else
216 return inner::__distance_aux(first, last);
217#endif
218}
219 // IteratorOperation
221
222NEFORCE_END_NAMESPACE__
223#endif // NEFORCE_CORE_ALGORITHM_ITERATOR_HPP__
调试断点和断言工具
概念和类型约束
NEFORCE_INLINE17 constexpr bool is_signed_v
is_signed的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_arithmetic_v
is_arithmetic的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_pointer_v
is_pointer的便捷变量模板
#define NEFORCE_DEBUG_VERIFY(CON, MESG)
调试模式断言
NEFORCE_INLINE17 constexpr bool is_bid_iter_v
检查是否为双向迭代器
NEFORCE_INLINE17 constexpr bool is_ranges_bid_iter_v
检查是否为范围双向迭代器
NEFORCE_INLINE17 constexpr bool is_rnd_iter_v
检查是否为随机访问迭代器
NEFORCE_INLINE17 constexpr bool is_iter_v
检查类型是否为迭代器
NEFORCE_INLINE17 constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr void advance(Iterator &i, Distance n)
将迭代器前进指定距离
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)
计算两个迭代器之间的距离
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
typename iterator_traits< Iterator >::pointer iter_pointer_t
获取迭代器的指针类型
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名