Path: blob/main/contrib/llvm-project/libcxx/include/__iterator/distance.h
35233 views
// -*- C++ -*-1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//89#ifndef _LIBCPP___ITERATOR_DISTANCE_H10#define _LIBCPP___ITERATOR_DISTANCE_H1112#include <__config>13#include <__iterator/concepts.h>14#include <__iterator/incrementable_traits.h>15#include <__iterator/iterator_traits.h>16#include <__ranges/access.h>17#include <__ranges/concepts.h>18#include <__ranges/size.h>19#include <__type_traits/decay.h>20#include <__type_traits/remove_cvref.h>2122#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)23# pragma GCC system_header24#endif2526_LIBCPP_BEGIN_NAMESPACE_STD2728template <class _InputIter>29inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type30__distance(_InputIter __first, _InputIter __last, input_iterator_tag) {31typename iterator_traits<_InputIter>::difference_type __r(0);32for (; __first != __last; ++__first)33++__r;34return __r;35}3637template <class _RandIter>38inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_RandIter>::difference_type39__distance(_RandIter __first, _RandIter __last, random_access_iterator_tag) {40return __last - __first;41}4243template <class _InputIter>44inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 typename iterator_traits<_InputIter>::difference_type45distance(_InputIter __first, _InputIter __last) {46return std::__distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category());47}4849#if _LIBCPP_STD_VER >= 205051// [range.iter.op.distance]5253namespace ranges {54namespace __distance {5556struct __fn {57template <class _Ip, sentinel_for<_Ip> _Sp>58requires(!sized_sentinel_for<_Sp, _Ip>)59_LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip __first, _Sp __last) const {60iter_difference_t<_Ip> __n = 0;61while (__first != __last) {62++__first;63++__n;64}65return __n;66}6768template <class _Ip, sized_sentinel_for<decay_t<_Ip>> _Sp>69_LIBCPP_HIDE_FROM_ABI constexpr iter_difference_t<_Ip> operator()(_Ip&& __first, _Sp __last) const {70if constexpr (sized_sentinel_for<_Sp, __remove_cvref_t<_Ip>>) {71return __last - __first;72} else {73return __last - decay_t<_Ip>(__first);74}75}7677template <range _Rp>78_LIBCPP_HIDE_FROM_ABI constexpr range_difference_t<_Rp> operator()(_Rp&& __r) const {79if constexpr (sized_range<_Rp>) {80return static_cast<range_difference_t<_Rp>>(ranges::size(__r));81} else {82return operator()(ranges::begin(__r), ranges::end(__r));83}84}85};8687} // namespace __distance8889inline namespace __cpo {90inline constexpr auto distance = __distance::__fn{};91} // namespace __cpo92} // namespace ranges9394#endif // _LIBCPP_STD_VER >= 209596_LIBCPP_END_NAMESPACE_STD9798#endif // _LIBCPP___ITERATOR_DISTANCE_H99100101