1#ifndef NEFORCE_CORE_ALGORITHM_ITERATOR_HPP__
2#define NEFORCE_CORE_ALGORITHM_ITERATOR_HPP__
14NEFORCE_BEGIN_NAMESPACE__
22#ifndef NEFORCE_STANDARD_17
26template <
typename Ptr>
27constexpr enable_if_t<is_pointer_v<Ptr>, iter_pointer_t<Ptr>> __to_pointer_aux(Ptr iter) {
31template <
typename Iterator>
32constexpr enable_if_t<!is_pointer_v<Iterator>, iter_pointer_t<Iterator>> __to_pointer_aux(Iterator iter) {
33 return iter.operator->();
46template <
typename Iterator>
48#ifdef NEFORCE_STANDARD_17
52 return iter.operator->();
55 return inner::__to_pointer_aux(iter);
60#ifndef NEFORCE_STANDARD_17
64template <
typename Iterator,
typename Distance>
65constexpr enable_if_t<is_rnd_iter_v<Iterator>> __advance_aux(Iterator& i, Distance n) {
69template <
typename Iterator,
typename Distance>
70constexpr enable_if_t<!is_rnd_iter_v<Iterator> && is_ranges_bid_iter_v<Iterator>> __advance_aux(Iterator& i,
80template <
typename Iterator,
typename Distance>
81constexpr enable_if_t<!is_rnd_iter_v<Iterator> && !is_ranges_bid_iter_v<Iterator>> __advance_aux(Iterator& i,
83 NEFORCE_DEBUG_VERIFY__(is_signed_v<Distance> && n >= 0,
"negative advance of non-bidirectional iterator");
105template <
typename Iterator,
typename Distance>
106constexpr void advance(Iterator& i, Distance n) {
110#ifdef NEFORCE_STANDARD_17
115 NEFORCE_DEBUG_VERIFY(n >= 0,
"negative advance of non-bidirectional iterator");
127 inner::__advance_aux(i, n);
140template <
typename Iterator>
142 NEFORCE_DEBUG_VERIFY(n >= 0,
"negative advance in previous operation function.");
156template <
typename Iterator>
158 NEFORCE_DEBUG_VERIFY(n >= 0,
"positive advance in next operation function.");
164#ifndef NEFORCE_STANDARD_17
168template <
typename Iterator>
169constexpr enable_if_t<is_rnd_iter_v<Iterator>, iter_difference_t<Iterator>> __distance_aux(Iterator first,
174template <
typename Iterator>
175constexpr enable_if_t<!is_rnd_iter_v<Iterator>, iter_difference_t<Iterator>> __distance_aux(Iterator first,
177 iter_difference_t<Iterator> n = 0;
178 while (first != last) {
200template <
typename Iterator>
204#ifdef NEFORCE_STANDARD_17
209 while (first != last) {
216 return inner::__distance_aux(first, last);
222NEFORCE_END_NAMESPACE__
constexpr bool is_arithmetic_v
is_arithmetic的便捷变量模板
constexpr bool is_signed_v
is_signed的便捷变量模板
constexpr bool is_pointer_v
is_pointer的便捷变量模板
constexpr bool is_iter_v
检查类型是否为迭代器
constexpr bool is_bid_iter_v
检查是否为双向迭代器
constexpr bool is_rnd_iter_v
检查是否为随机访问迭代器
constexpr bool is_ranges_rnd_iter_v
检查是否为范围随机访问迭代器
constexpr iter_pointer_t< Iterator > to_pointer(Iterator iter)
将迭代器转换为原始指针
constexpr iter_difference_t< Iterator > distance(Iterator first, Iterator last)
计算两个迭代器之间的距离
constexpr void advance(Iterator &i, Distance n)
将迭代器前进指定距离
constexpr Iterator prev(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的前一个位置
constexpr Iterator next(Iterator iter, iter_difference_t< Iterator > n=1)
获取迭代器的后一个位置
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
typename iterator_traits< Iterator >::pointer iter_pointer_t
获取迭代器的指针类型