Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-03 08:13:53

0001 // -*- C++ -*-
0002 //===----------------------------------------------------------------------===//
0003 //
0004 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0005 // See https://llvm.org/LICENSE.txt for license information.
0006 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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 // [range.iter.op.distance]
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 } // namespace __cpo
0089 } // namespace ranges
0090 
0091 #endif // _LIBCPP_STD_VER >= 20
0092 
0093 _LIBCPP_END_NAMESPACE_STD
0094 
0095 #endif // _LIBCPP___ITERATOR_DISTANCE_H