File indexing completed on 2026-05-03 08:13:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___ITERATOR_DISTANCE_H
0011 #define _LIBCPP___ITERATOR_DISTANCE_H
0012
0013 #include <__config>
0014 #include <__iterator/concepts.h>
0015 #include <__iterator/incrementable_traits.h>
0016 #include <__iterator/iterator_traits.h>
0017 #include <__ranges/access.h>
0018 #include <__ranges/concepts.h>
0019 #include <__ranges/size.h>
0020 #include <__type_traits/decay.h>
0021 #include <__type_traits/remove_cvref.h>
0022
0023 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
0024 # pragma GCC system_header
0025 #endif
0026
0027 _LIBCPP_BEGIN_NAMESPACE_STD
0028
0029 template <class _InputIter>
0030 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type
0031 __distance(_InputIter __first, _InputIter __last, input_iterator_tag) {
0032 typename iterator_traits<_InputIter>::difference_type __r(0);
0033 for (; __first != __last; ++__first)
0034 ++__r;
0035 return __r;
0036 }
0037
0038 template <class _RandIter>
0039 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_RandIter>::difference_type
0040 __distance(_RandIter __first, _RandIter __last, random_access_iterator_tag) {
0041 return __last - __first;
0042 }
0043
0044 template <class _InputIter>
0045 inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type
0046 distance(_InputIter __first, _InputIter __last) {
0047 return std::__distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category());
0048 }
0049
0050 #if _LIBCPP_STD_VER >= 20
0051
0052
0053
0054 namespace ranges {
0055 struct __distance {
0056 template <class _Ip, sentinel_for<_Ip> _Sp>
0057 requires(!sized_sentinel_for<_Sp, _Ip>)
0058 _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip __first, _Sp __last) const {
0059 iter_difference_t<_Ip> __n = 0;
0060 while (__first != __last) {
0061 ++__first;
0062 ++__n;
0063 }
0064 return __n;
0065 }
0066
0067 template <class _Ip, sized_sentinel_for<decay_t<_Ip>> _Sp>
0068 _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip&& __first, _Sp __last) const {
0069 if constexpr (sized_sentinel_for<_Sp, __remove_cvref_t<_Ip>>) {
0070 return __last - __first;
0071 } else {
0072 return __last - decay_t<_Ip>(__first);
0073 }
0074 }
0075
0076 template <range _Rp>
0077 _LIBCPP_HIDE_FROM_ABI constexpr range_difference_t<_Rp> operator()(_Rp&& __r) const {
0078 if constexpr (sized_range<_Rp>) {
0079 return static_cast<range_difference_t<_Rp>>(ranges::size(__r));
0080 } else {
0081 return operator()(ranges::begin(__r), ranges::end(__r));
0082 }
0083 }
0084 };
0085
0086 inline namespace __cpo {
0087 inline constexpr auto distance = __distance{};
0088 }
0089 }
0090
0091 #endif
0092
0093 _LIBCPP_END_NAMESPACE_STD
0094
0095 #endif