diff options
Diffstat (limited to 'libcxx/include/__algorithm')
| -rw-r--r-- | libcxx/include/__algorithm/copy.h | 16 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/copy_backward.h | 42 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/equal_range.h | 1 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/includes.h | 19 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/inplace_merge.h | 4 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/is_heap.h | 2 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/is_heap_until.h | 4 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/ranges_copy_backward.h | 7 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/ranges_generate.h | 24 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/ranges_generate_n.h | 14 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/ranges_includes.h | 8 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/ranges_is_heap.h | 23 | ||||
| -rw-r--r-- | libcxx/include/__algorithm/ranges_is_heap_until.h | 20 | 
13 files changed, 106 insertions, 78 deletions
| diff --git a/libcxx/include/__algorithm/copy.h b/libcxx/include/__algorithm/copy.h index 886a1ac6ce3e..5428baa68859 100644 --- a/libcxx/include/__algorithm/copy.h +++ b/libcxx/include/__algorithm/copy.h @@ -58,20 +58,20 @@ pair<_InValueT*, _OutValueT*> __copy_impl(_InValueT* __first, _InValueT* __last,  template <class _InIter, class _OutIter,            __enable_if_t<is_same<typename remove_const<__iter_value_type<_InIter> >::type, __iter_value_type<_OutIter> >::value -                      && __is_cpp17_contiguous_iterator<_InIter>::value -                      && __is_cpp17_contiguous_iterator<_OutIter>::value -                      && is_trivially_copy_assignable<__iter_value_type<_OutIter> >::value, int> = 0> +                      && __is_cpp17_contiguous_iterator<typename _InIter::iterator_type>::value +                      && __is_cpp17_contiguous_iterator<typename _OutIter::iterator_type>::value +                      && is_trivially_copy_assignable<__iter_value_type<_OutIter> >::value +                      && __is_reverse_iterator<_InIter>::value +                      && __is_reverse_iterator<_OutIter>::value, int> = 0>  inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 -pair<reverse_iterator<_InIter>, reverse_iterator<_OutIter> > -__copy_impl(reverse_iterator<_InIter> __first, -            reverse_iterator<_InIter> __last, -            reverse_iterator<_OutIter> __result) { +pair<_InIter, _OutIter> +__copy_impl(_InIter __first, _InIter __last, _OutIter __result) {    auto __first_base = std::__unwrap_iter(__first.base());    auto __last_base = std::__unwrap_iter(__last.base());    auto __result_base = std::__unwrap_iter(__result.base());    auto __result_first = __result_base - (__first_base - __last_base);    std::__copy_impl(__last_base, __first_base, __result_first); -  return std::make_pair(__last, reverse_iterator<_OutIter>(std::__rewrap_iter(__result.base(), __result_first))); +  return std::make_pair(__last, _OutIter(std::__rewrap_iter(__result.base(), __result_first)));  }  template <class _InIter, class _Sent, class _OutIter, diff --git a/libcxx/include/__algorithm/copy_backward.h b/libcxx/include/__algorithm/copy_backward.h index dd43a91ffa87..26b8c4d791fd 100644 --- a/libcxx/include/__algorithm/copy_backward.h +++ b/libcxx/include/__algorithm/copy_backward.h @@ -10,10 +10,16 @@  #define _LIBCPP___ALGORITHM_COPY_BACKWARD_H  #include <__algorithm/copy.h> +#include <__algorithm/iterator_operations.h> +#include <__algorithm/ranges_copy.h>  #include <__algorithm/unwrap_iter.h> +#include <__concepts/same_as.h>  #include <__config>  #include <__iterator/iterator_traits.h>  #include <__iterator/reverse_iterator.h> +#include <__ranges/subrange.h> +#include <__utility/move.h> +#include <__utility/pair.h>  #include <cstring>  #include <type_traits> @@ -23,29 +29,31 @@  _LIBCPP_BEGIN_NAMESPACE_STD -template <class _Iter1, class _Sent1, class _Iter2> -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 -pair<_Iter1, _Iter2> __copy_backward_impl(_Iter1 __first, _Sent1 __last, _Iter2 __result) { -  auto __ret = std::__copy(reverse_iterator<_Iter1>(__last), -                           reverse_iterator<_Sent1>(__first), -                           reverse_iterator<_Iter2>(__result)); -  return pair<_Iter1, _Iter2>(__ret.first.base(), __ret.second.base()); +template <class _AlgPolicy, class _InputIterator, class _OutputIterator, +          __enable_if_t<is_same<_AlgPolicy, _ClassicAlgPolicy>::value, int> = 0> +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 pair<_InputIterator, _OutputIterator> +__copy_backward(_InputIterator __first, _InputIterator __last, _OutputIterator __result) { +  auto __ret = std::__copy( +      __unconstrained_reverse_iterator<_InputIterator>(__last), +      __unconstrained_reverse_iterator<_InputIterator>(__first), +      __unconstrained_reverse_iterator<_OutputIterator>(__result)); +  return pair<_InputIterator, _OutputIterator>(__ret.first.base(), __ret.second.base());  } -template <class _Iter1, class _Sent1, class _Iter2> -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX11 -pair<_Iter1, _Iter2> __copy_backward(_Iter1 __first, _Sent1 __last, _Iter2 __result) { -  auto __ret = std::__copy_backward_impl(std::__unwrap_iter(__first), -                                         std::__unwrap_iter(__last), -                                         std::__unwrap_iter(__result)); -  return pair<_Iter1, _Iter2>(std::__rewrap_iter(__first, __ret.first), std::__rewrap_iter(__result, __ret.second)); +#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) +template <class _AlgPolicy, class _Iter1, class _Sent1, class _Iter2, +          __enable_if_t<is_same<_AlgPolicy, _RangeAlgPolicy>::value, int> = 0> +_LIBCPP_HIDE_FROM_ABI constexpr pair<_Iter1, _Iter2> __copy_backward(_Iter1 __first, _Sent1 __last, _Iter2 __result) { +  auto __reverse_range = std::__reverse_range(std::ranges::subrange(std::move(__first), std::move(__last))); +  auto __ret           = ranges::copy(std::move(__reverse_range), std::make_reverse_iterator(__result)); +  return std::make_pair(__ret.in.base(), __ret.out.base());  } +#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES)  template <class _BidirectionalIterator1, class _BidirectionalIterator2> -inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 -_BidirectionalIterator2 +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _BidirectionalIterator2  copy_backward(_BidirectionalIterator1 __first, _BidirectionalIterator1 __last, _BidirectionalIterator2 __result) { -  return std::__copy_backward(__first, __last, __result).second; +  return std::__copy_backward<_ClassicAlgPolicy>(__first, __last, __result).second;  }  _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/__algorithm/equal_range.h b/libcxx/include/__algorithm/equal_range.h index 42d009ebbc0f..b11165baf384 100644 --- a/libcxx/include/__algorithm/equal_range.h +++ b/libcxx/include/__algorithm/equal_range.h @@ -21,6 +21,7 @@  #include <__iterator/advance.h>  #include <__iterator/distance.h>  #include <__iterator/iterator_traits.h> +#include <__iterator/next.h>  #include <__type_traits/is_callable.h>  #include <__type_traits/is_copy_constructible.h>  #include <__utility/move.h> diff --git a/libcxx/include/__algorithm/includes.h b/libcxx/include/__algorithm/includes.h index 102d3db39a2d..c64194a2c826 100644 --- a/libcxx/include/__algorithm/includes.h +++ b/libcxx/include/__algorithm/includes.h @@ -12,7 +12,10 @@  #include <__algorithm/comp.h>  #include <__algorithm/comp_ref_type.h>  #include <__config> +#include <__functional/identity.h> +#include <__functional/invoke.h>  #include <__iterator/iterator_traits.h> +#include <__type_traits/is_callable.h>  #include <__utility/move.h>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -21,13 +24,15 @@  _LIBCPP_BEGIN_NAMESPACE_STD -template <class _Iter1, class _Sent1, class _Iter2, class _Sent2, class _Comp> +template <class _Iter1, class _Sent1, class _Iter2, class _Sent2, class _Comp, class _Proj1, class _Proj2>  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 bool -__includes(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, _Comp&& __comp) { +__includes(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2, +           _Comp&& __comp, _Proj1&& __proj1, _Proj2&& __proj2) {    for (; __first2 != __last2; ++__first1) { -    if (__first1 == __last1 || __comp(*__first2, *__first1)) +    if (__first1 == __last1 || std::__invoke( +          __comp, std::__invoke(__proj2, *__first2), std::__invoke(__proj1, *__first1)))        return false; -    if (!__comp(*__first1, *__first2)) +    if (!std::__invoke(__comp, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2)))        ++__first2;    }    return true; @@ -40,9 +45,13 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17      _InputIterator2 __first2,      _InputIterator2 __last2,      _Compare __comp) { +  static_assert(__is_callable<_Compare, decltype(*__first1), decltype(*__first2)>::value, +      "Comparator has to be callable"); +    typedef typename __comp_ref_type<_Compare>::type _Comp_ref;    return std::__includes( -      std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), static_cast<_Comp_ref>(__comp)); +      std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), +      static_cast<_Comp_ref>(__comp), __identity(), __identity());  }  template <class _InputIterator1, class _InputIterator2> diff --git a/libcxx/include/__algorithm/inplace_merge.h b/libcxx/include/__algorithm/inplace_merge.h index f4364969b8f9..cb662e791872 100644 --- a/libcxx/include/__algorithm/inplace_merge.h +++ b/libcxx/include/__algorithm/inplace_merge.h @@ -105,8 +105,8 @@ __buffered_inplace_merge(_BidirectionalIterator __first, _BidirectionalIterator          value_type* __p = __buff;          for (_BidirectionalIterator __i = __middle; __i != __last; __d.template __incr<value_type>(), (void) ++__i, (void) ++__p)              ::new ((void*)__p) value_type(_IterOps<_AlgPolicy>::__iter_move(__i)); -        typedef reverse_iterator<_BidirectionalIterator> _RBi; -        typedef reverse_iterator<value_type*> _Rv; +        typedef __unconstrained_reverse_iterator<_BidirectionalIterator> _RBi; +        typedef __unconstrained_reverse_iterator<value_type*> _Rv;          typedef __invert<_Compare> _Inverted;          std::__half_inplace_merge<_AlgPolicy, _Inverted>(_Rv(__p), _Rv(__buff),                                      _RBi(__middle), _RBi(__first), diff --git a/libcxx/include/__algorithm/is_heap.h b/libcxx/include/__algorithm/is_heap.h index fe44e634f6dd..0d399a09b857 100644 --- a/libcxx/include/__algorithm/is_heap.h +++ b/libcxx/include/__algorithm/is_heap.h @@ -28,7 +28,7 @@ bool  is_heap(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)  {      typedef typename __comp_ref_type<_Compare>::type _Comp_ref; -    return _VSTD::__is_heap_until<_Comp_ref>(__first, __last, __comp) == __last; +    return std::__is_heap_until(__first, __last, static_cast<_Comp_ref>(__comp)) == __last;  }  template<class _RandomAccessIterator> diff --git a/libcxx/include/__algorithm/is_heap_until.h b/libcxx/include/__algorithm/is_heap_until.h index 39f313eb0d3f..adb35af887fb 100644 --- a/libcxx/include/__algorithm/is_heap_until.h +++ b/libcxx/include/__algorithm/is_heap_until.h @@ -22,7 +22,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD  template <class _Compare, class _RandomAccessIterator>  _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17 _RandomAccessIterator -__is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp) +__is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare&& __comp)  {      typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;      difference_type __len = __last - __first; @@ -52,7 +52,7 @@ _LIBCPP_NODISCARD_EXT inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_AFTER_CXX17  is_heap_until(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)  {      typedef typename __comp_ref_type<_Compare>::type _Comp_ref; -    return _VSTD::__is_heap_until<_Comp_ref>(__first, __last, __comp); +    return std::__is_heap_until(__first, __last, static_cast<_Comp_ref>(__comp));  }  template<class _RandomAccessIterator> diff --git a/libcxx/include/__algorithm/ranges_copy_backward.h b/libcxx/include/__algorithm/ranges_copy_backward.h index 49c1b26add6d..673df8025fab 100644 --- a/libcxx/include/__algorithm/ranges_copy_backward.h +++ b/libcxx/include/__algorithm/ranges_copy_backward.h @@ -11,6 +11,7 @@  #include <__algorithm/copy_backward.h>  #include <__algorithm/in_out_result.h> +#include <__algorithm/iterator_operations.h>  #include <__config>  #include <__iterator/concepts.h>  #include <__iterator/reverse_iterator.h> @@ -39,7 +40,7 @@ struct __fn {      requires indirectly_copyable<_InIter1, _InIter2>    _LIBCPP_HIDE_FROM_ABI constexpr    copy_backward_result<_InIter1, _InIter2> operator()(_InIter1 __first, _Sent1 __last, _InIter2 __result) const { -    auto __ret = std::__copy_backward(std::move(__first), std::move(__last), std::move(__result)); +    auto __ret = std::__copy_backward<_RangeAlgPolicy>(std::move(__first), std::move(__last), std::move(__result));      return {std::move(__ret.first), std::move(__ret.second)};    } @@ -47,9 +48,7 @@ struct __fn {      requires indirectly_copyable<iterator_t<_Range>, _Iter>    _LIBCPP_HIDE_FROM_ABI constexpr    copy_backward_result<borrowed_iterator_t<_Range>, _Iter> operator()(_Range&& __r, _Iter __result) const { -    auto __ret = std::__copy_backward(ranges::begin(__r), -                                      ranges::end(__r), -                                      std::move(__result)); +    auto __ret = std::__copy_backward<_RangeAlgPolicy>(ranges::begin(__r), ranges::end(__r), std::move(__result));      return {std::move(__ret.first), std::move(__ret.second)};    }  }; diff --git a/libcxx/include/__algorithm/ranges_generate.h b/libcxx/include/__algorithm/ranges_generate.h index c23645e6d906..149296574d80 100644 --- a/libcxx/include/__algorithm/ranges_generate.h +++ b/libcxx/include/__algorithm/ranges_generate.h @@ -9,21 +9,15 @@  #ifndef _LIBCPP___ALGORITHM_RANGES_GENERATE_H  #define _LIBCPP___ALGORITHM_RANGES_GENERATE_H -#include <__algorithm/generate.h> -#include <__algorithm/make_projected.h>  #include <__concepts/constructible.h>  #include <__concepts/invocable.h>  #include <__config> -#include <__functional/identity.h>  #include <__functional/invoke.h> -#include <__functional/ranges_operations.h>  #include <__iterator/concepts.h>  #include <__iterator/iterator_traits.h> -#include <__iterator/projected.h>  #include <__ranges/access.h>  #include <__ranges/concepts.h>  #include <__ranges/dangling.h> -#include <__utility/forward.h>  #include <__utility/move.h>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -39,22 +33,28 @@ namespace __generate {  struct __fn { +  template <class _OutIter, class _Sent, class _Func> +  _LIBCPP_HIDE_FROM_ABI constexpr +  static _OutIter __generate_fn_impl(_OutIter __first, _Sent __last, _Func& __gen) { +    for (; __first != __last; ++__first) { +      *__first = __gen(); +    } + +    return __first; +  } +    template <input_or_output_iterator _OutIter, sentinel_for<_OutIter> _Sent, copy_constructible _Func>    requires invocable<_Func&> && indirectly_writable<_OutIter, invoke_result_t<_Func&>>    _LIBCPP_HIDE_FROM_ABI constexpr    _OutIter operator()(_OutIter __first, _Sent __last, _Func __gen) const { -    // TODO: implement -    (void)__first; (void)__last; (void)__gen; -    return {}; +    return __generate_fn_impl(std::move(__first), std::move(__last), __gen);    }    template <class _Range, copy_constructible _Func>    requires invocable<_Func&> && output_range<_Range, invoke_result_t<_Func&>>    _LIBCPP_HIDE_FROM_ABI constexpr    borrowed_iterator_t<_Range> operator()(_Range&& __range, _Func __gen) const { -    // TODO: implement -    (void)__range; (void)__gen; -    return {}; +    return __generate_fn_impl(ranges::begin(__range), ranges::end(__range), __gen);    }  }; diff --git a/libcxx/include/__algorithm/ranges_generate_n.h b/libcxx/include/__algorithm/ranges_generate_n.h index 7bde5fb4e579..63f466cecdd7 100644 --- a/libcxx/include/__algorithm/ranges_generate_n.h +++ b/libcxx/include/__algorithm/ranges_generate_n.h @@ -9,21 +9,16 @@  #ifndef _LIBCPP___ALGORITHM_RANGES_GENERATE_N_H  #define _LIBCPP___ALGORITHM_RANGES_GENERATE_N_H -#include <__algorithm/generate_n.h> -#include <__algorithm/make_projected.h>  #include <__concepts/constructible.h>  #include <__concepts/invocable.h>  #include <__config>  #include <__functional/identity.h>  #include <__functional/invoke.h> -#include <__functional/ranges_operations.h>  #include <__iterator/concepts.h>  #include <__iterator/incrementable_traits.h>  #include <__iterator/iterator_traits.h> -#include <__iterator/projected.h>  #include <__ranges/access.h>  #include <__ranges/concepts.h> -#include <__utility/forward.h>  #include <__utility/move.h>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -43,9 +38,12 @@ struct __fn {    requires invocable<_Func&> && indirectly_writable<_OutIter, invoke_result_t<_Func&>>    _LIBCPP_HIDE_FROM_ABI constexpr    _OutIter operator()(_OutIter __first, iter_difference_t<_OutIter> __n, _Func __gen) const { -    // TODO: implement -    (void)__first; (void)__n; (void)__gen; -    return {}; +    for (; __n > 0; --__n) { +      *__first = __gen(); +      ++__first; +    } + +    return __first;    }  }; diff --git a/libcxx/include/__algorithm/ranges_includes.h b/libcxx/include/__algorithm/ranges_includes.h index ba054e6fd89d..2c7581af68af 100644 --- a/libcxx/include/__algorithm/ranges_includes.h +++ b/libcxx/include/__algorithm/ranges_includes.h @@ -56,7 +56,9 @@ struct __fn {          std::move(__last1),          std::move(__first2),          std::move(__last2), -        ranges::__make_projected_comp(__comp, __proj1, __proj2)); +        std::move(__comp), +        std::move(__proj1), +        std::move(__proj2));    }    template < @@ -73,7 +75,9 @@ struct __fn {          ranges::end(__range1),          ranges::begin(__range2),          ranges::end(__range2), -        ranges::__make_projected_comp(__comp, __proj1, __proj2)); +        std::move(__comp), +        std::move(__proj1), +        std::move(__proj2));    }  }; diff --git a/libcxx/include/__algorithm/ranges_is_heap.h b/libcxx/include/__algorithm/ranges_is_heap.h index 00105189fed7..a3e86d1a8d72 100644 --- a/libcxx/include/__algorithm/ranges_is_heap.h +++ b/libcxx/include/__algorithm/ranges_is_heap.h @@ -9,18 +9,17 @@  #ifndef _LIBCPP___ALGORITHM_RANGES_IS_HEAP_H  #define _LIBCPP___ALGORITHM_RANGES_IS_HEAP_H -#include <__algorithm/is_heap.h> +#include <__algorithm/is_heap_until.h>  #include <__algorithm/make_projected.h>  #include <__config>  #include <__functional/identity.h> -#include <__functional/invoke.h>  #include <__functional/ranges_operations.h>  #include <__iterator/concepts.h>  #include <__iterator/iterator_traits.h> +#include <__iterator/next.h>  #include <__iterator/projected.h>  #include <__ranges/access.h>  #include <__ranges/concepts.h> -#include <__utility/forward.h>  #include <__utility/move.h>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -36,22 +35,28 @@ namespace __is_heap {  struct __fn { +  template <class _Iter, class _Sent, class _Proj, class _Comp> +  _LIBCPP_HIDE_FROM_ABI constexpr +  static bool __is_heap_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { +    auto __last_iter = ranges::next(__first, __last); +    auto&& __projected_comp = ranges::__make_projected_comp(__comp, __proj); + +    auto __result = std::__is_heap_until(std::move(__first), std::move(__last_iter), __projected_comp); +    return __result == __last; +  } +    template <random_access_iterator _Iter, sentinel_for<_Iter> _Sent, class _Proj = identity,              indirect_strict_weak_order<projected<_Iter, _Proj>> _Comp = ranges::less>    _LIBCPP_HIDE_FROM_ABI constexpr    bool operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { -    // TODO: implement -    (void)__first; (void)__last; (void)__comp; (void)__proj; -    return {}; +    return __is_heap_fn_impl(std::move(__first), std::move(__last), __comp, __proj);    }    template <random_access_range _Range, class _Proj = identity,              indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>> _Comp = ranges::less>    _LIBCPP_HIDE_FROM_ABI constexpr    bool operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { -    // TODO: implement -    (void)__range; (void)__comp; (void)__proj; -    return {}; +    return __is_heap_fn_impl(ranges::begin(__range), ranges::end(__range), __comp, __proj);    }  }; diff --git a/libcxx/include/__algorithm/ranges_is_heap_until.h b/libcxx/include/__algorithm/ranges_is_heap_until.h index ad021d6f2525..bcd33ad404e8 100644 --- a/libcxx/include/__algorithm/ranges_is_heap_until.h +++ b/libcxx/include/__algorithm/ranges_is_heap_until.h @@ -13,15 +13,14 @@  #include <__algorithm/make_projected.h>  #include <__config>  #include <__functional/identity.h> -#include <__functional/invoke.h>  #include <__functional/ranges_operations.h>  #include <__iterator/concepts.h>  #include <__iterator/iterator_traits.h> +#include <__iterator/next.h>  #include <__iterator/projected.h>  #include <__ranges/access.h>  #include <__ranges/concepts.h>  #include <__ranges/dangling.h> -#include <__utility/forward.h>  #include <__utility/move.h>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) @@ -37,22 +36,27 @@ namespace __is_heap_until {  struct __fn { +  template <class _Iter, class _Sent, class _Proj, class _Comp> +  _LIBCPP_HIDE_FROM_ABI constexpr +  static _Iter __is_heap_until_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { +    auto __last_iter = ranges::next(__first, __last); +    auto&& __projected_comp = ranges::__make_projected_comp(__comp, __proj); + +    return std::__is_heap_until(std::move(__first), std::move(__last_iter), __projected_comp); +  } +    template <random_access_iterator _Iter, sentinel_for<_Iter> _Sent, class _Proj = identity,              indirect_strict_weak_order<projected<_Iter, _Proj>> _Comp = ranges::less>    _LIBCPP_HIDE_FROM_ABI constexpr    _Iter operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { -    // TODO: implement -    (void)__first; (void)__last; (void)__comp; (void)__proj; -    return {}; +    return __is_heap_until_fn_impl(std::move(__first), std::move(__last), __comp, __proj);    }    template <random_access_range _Range, class _Proj = identity,              indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>> _Comp = ranges::less>    _LIBCPP_HIDE_FROM_ABI constexpr    borrowed_iterator_t<_Range> operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const { -    // TODO: implement -    (void)__range; (void)__comp; (void)__proj; -    return {}; +    return __is_heap_until_fn_impl(ranges::begin(__range), ranges::end(__range), __comp, __proj);    }  }; | 
