@@ -33,54 +33,35 @@ _LIBCPP_PUSH_MACROS
33
33
34
34
_LIBCPP_BEGIN_NAMESPACE_STD
35
35
36
- #if _LIBCPP_STD_VER >= 20
37
- template <class _Iter >
38
- using __iter_distance_t _LIBCPP_NODEBUG = std::iter_difference_t <_Iter>;
39
- #else
40
- template <class _Iter >
41
- using __iter_distance_t _LIBCPP_NODEBUG = typename iterator_traits<_Iter>::difference_type;
42
- #endif
43
-
44
36
template <class _InputIter , class _Sent >
45
- inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 __iter_distance_t <_InputIter>
37
+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits <_InputIter>::difference_type
46
38
__distance (_InputIter __first, _Sent __last) {
47
- __iter_distance_t <_InputIter> __r (0 );
39
+ typename iterator_traits <_InputIter>::difference_type __r (0 );
48
40
for (; __first != __last; ++__first)
49
41
++__r;
50
42
return __r;
51
43
}
52
44
53
45
template <class _RandIter , __enable_if_t <__has_random_access_iterator_category<_RandIter>::value, int > = 0 >
54
- inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 __iter_distance_t <_RandIter>
46
+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits <_RandIter>::difference_type
55
47
__distance (_RandIter __first, _RandIter __last) {
56
48
return __last - __first;
57
49
}
58
50
59
- template <class _SegmentedIter , class _Difference >
60
- struct __segment_distance {
61
- using _Traits _LIBCPP_NODEBUG = __segmented_iterator_traits<_SegmentedIter>;
62
-
63
- _Difference& __r_;
64
-
65
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 explicit __segment_distance (_Difference& __r) : __r_(__r) {}
66
-
67
- _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 void
68
- operator ()(typename _Traits::__local_iterator __lfirst, typename _Traits::__local_iterator __llast) {
69
- __r_ += std::__distance (__lfirst, __llast);
70
- }
71
- };
72
-
51
+ #if _LIBCPP_STD_VER >= 20
73
52
template <class _SegmentedIter ,
74
53
__enable_if_t <!__has_random_access_iterator_category<_SegmentedIter>::value &&
75
54
__is_segmented_iterator<_SegmentedIter>::value,
76
55
int > = 0 >
77
- inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 __iter_distance_t <_SegmentedIter>
56
+ inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits <_SegmentedIter>::difference_type
78
57
__distance (_SegmentedIter __first, _SegmentedIter __last) {
79
- using __difference_type = __iter_distance_t <_SegmentedIter>;
80
- __difference_type __r (0 );
81
- std::__for_each_segment (__first, __last, std::__segment_distance<_SegmentedIter, __difference_type>(__r));
58
+ typename iterator_traits<_SegmentedIter>::difference_type __r (0 );
59
+ std::__for_each_segment (__first, __last, [&__r](auto __lfirst, auto __llast) {
60
+ __r += std::__distance (__lfirst, __llast);
61
+ });
82
62
return __r;
83
63
}
64
+ #endif // _LIBCPP_STD_VER >= 20
84
65
85
66
template <class _InputIter >
86
67
inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type
@@ -97,7 +78,7 @@ struct __distance {
97
78
template <class _Ip , sentinel_for<_Ip> _Sp>
98
79
requires (!sized_sentinel_for<_Sp, _Ip>)
99
80
_LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t <_Ip> operator ()(_Ip __first, _Sp __last) const {
100
- return std::__distance (std::move (__first), std::move (__last));
81
+ return static_cast < iter_difference_t <_Ip>>( std::__distance (std::move (__first), std::move (__last) ));
101
82
}
102
83
103
84
template <class _Ip , sized_sentinel_for<decay_t <_Ip>> _Sp>
0 commit comments