File indexing completed on 2026-05-03 08:13:32
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _LIBCPP___CXX03___ITERATOR_DISTANCE_H
0011 #define _LIBCPP___CXX03___ITERATOR_DISTANCE_H
0012
0013 #include <__cxx03/__config>
0014 #include <__cxx03/__iterator/concepts.h>
0015 #include <__cxx03/__iterator/incrementable_traits.h>
0016 #include <__cxx03/__iterator/iterator_traits.h>
0017 #include <__cxx03/__ranges/access.h>
0018 #include <__cxx03/__ranges/concepts.h>
0019 #include <__cxx03/__ranges/size.h>
0020 #include <__cxx03/__type_traits/decay.h>
0021 #include <__cxx03/__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 namespace __distance {
0056
0057 struct __fn {
0058 template <class _Ip, sentinel_for<_Ip> _Sp>
0059 requires(!sized_sentinel_for<_Sp, _Ip>)
0060 _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip __first, _Sp __last) const {
0061 iter_difference_t<_Ip> __n = 0;
0062 while (__first != __last) {
0063 ++__first;
0064 ++__n;
0065 }
0066 return __n;
0067 }
0068
0069 template <class _Ip, sized_sentinel_for<decay_t<_Ip>> _Sp>
0070 _LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip&& __first, _Sp __last) const {
0071 if constexpr (sized_sentinel_for<_Sp, __remove_cvref_t<_Ip>>) {
0072 return __last - __first;
0073 } else {
0074 return __last - decay_t<_Ip>(__first);
0075 }
0076 }
0077
0078 template <range _Rp>
0079 _LIBCPP_HIDE_FROM_ABI constexpr range_difference_t<_Rp> operator()(_Rp&& __r) const {
0080 if constexpr (sized_range<_Rp>) {
0081 return static_cast<range_difference_t<_Rp>>(ranges::size(__r));
0082 } else {
0083 return operator()(ranges::begin(__r), ranges::end(__r));
0084 }
0085 }
0086 };
0087
0088 }
0089
0090 inline namespace __cpo {
0091 inline constexpr auto distance = __distance::__fn{};
0092 }
0093 }
0094
0095 #endif
0096
0097 _LIBCPP_END_NAMESPACE_STD
0098
0099 #endif