diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:03:47 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2023-07-26 19:04:23 +0000 | 
| commit | 7fa27ce4a07f19b07799a767fc29416f3b625afb (patch) | |
| tree | 27825c83636c4de341eb09a74f49f5d38a15d165 /libcxx/include/__algorithm/ranges_partition_copy.h | |
| parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) | |
Diffstat (limited to 'libcxx/include/__algorithm/ranges_partition_copy.h')
| -rw-r--r-- | libcxx/include/__algorithm/ranges_partition_copy.h | 55 | 
1 files changed, 31 insertions, 24 deletions
| diff --git a/libcxx/include/__algorithm/ranges_partition_copy.h b/libcxx/include/__algorithm/ranges_partition_copy.h index e7a9a347df5a..6a16b02db3e5 100644 --- a/libcxx/include/__algorithm/ranges_partition_copy.h +++ b/libcxx/include/__algorithm/ranges_partition_copy.h @@ -19,14 +19,14 @@  #include <__ranges/access.h>  #include <__ranges/concepts.h>  #include <__ranges/dangling.h> +#include <__type_traits/remove_cvref.h>  #include <__utility/move.h> -#include <type_traits>  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)  #  pragma GCC system_header  #endif -#if _LIBCPP_STD_VER > 17 +#if _LIBCPP_STD_VER >= 20  _LIBCPP_BEGIN_NAMESPACE_STD @@ -38,14 +38,18 @@ using partition_copy_result = in_out_out_result<_InIter, _OutIter1, _OutIter2>;  namespace __partition_copy {  struct __fn { -    // TODO(ranges): delegate to the classic algorithm.    template <class _InIter, class _Sent, class _OutIter1, class _OutIter2, class _Proj, class _Pred> -  _LIBCPP_HIDE_FROM_ABI constexpr -  static partition_copy_result< -      __remove_cvref_t<_InIter>, __remove_cvref_t<_OutIter1>, __remove_cvref_t<_OutIter2> -  > __partition_copy_fn_impl( _InIter&& __first, _Sent&& __last, _OutIter1&& __out_true, _OutIter2&& __out_false, -      _Pred& __pred, _Proj& __proj) { +  _LIBCPP_HIDE_FROM_ABI constexpr static partition_copy_result<__remove_cvref_t<_InIter>, +                                                               __remove_cvref_t<_OutIter1>, +                                                               __remove_cvref_t<_OutIter2> > +  __partition_copy_fn_impl( +      _InIter&& __first, +      _Sent&& __last, +      _OutIter1&& __out_true, +      _OutIter2&& __out_false, +      _Pred& __pred, +      _Proj& __proj) {      for (; __first != __last; ++__first) {        if (std::invoke(__pred, std::invoke(__proj, *__first))) {          *__out_true = *__first; @@ -60,39 +64,42 @@ struct __fn {      return {std::move(__first), std::move(__out_true), std::move(__out_false)};    } -  template <input_iterator _InIter, sentinel_for<_InIter> _Sent, -            weakly_incrementable _OutIter1, weakly_incrementable _OutIter2, -            class _Proj = identity, indirect_unary_predicate<projected<_InIter, _Proj>> _Pred> -  requires indirectly_copyable<_InIter, _OutIter1> && indirectly_copyable<_InIter, _OutIter2> -  _LIBCPP_HIDE_FROM_ABI constexpr -  partition_copy_result<_InIter, _OutIter1, _OutIter2> -  operator()(_InIter __first, _Sent __last, _OutIter1 __out_true, _OutIter2 __out_false, -             _Pred __pred, _Proj __proj = {}) const { +  template <input_iterator _InIter, +            sentinel_for<_InIter> _Sent, +            weakly_incrementable _OutIter1, +            weakly_incrementable _OutIter2, +            class _Proj = identity, +            indirect_unary_predicate<projected<_InIter, _Proj>> _Pred> +    requires indirectly_copyable<_InIter, _OutIter1> && indirectly_copyable<_InIter, _OutIter2> +  _LIBCPP_HIDE_FROM_ABI constexpr partition_copy_result<_InIter, _OutIter1, _OutIter2> operator()( +      _InIter __first, _Sent __last, _OutIter1 __out_true, _OutIter2 __out_false, _Pred __pred, _Proj __proj = {}) +      const {      return __partition_copy_fn_impl(          std::move(__first), std::move(__last), std::move(__out_true), std::move(__out_false), __pred, __proj);    } -  template <input_range _Range, weakly_incrementable _OutIter1, weakly_incrementable _OutIter2, -            class _Proj = identity, indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>> _Pred> -  requires indirectly_copyable<iterator_t<_Range>, _OutIter1> && indirectly_copyable<iterator_t<_Range>, _OutIter2> -  _LIBCPP_HIDE_FROM_ABI constexpr -  partition_copy_result<borrowed_iterator_t<_Range>, _OutIter1, _OutIter2> +  template <input_range _Range, +            weakly_incrementable _OutIter1, +            weakly_incrementable _OutIter2, +            class _Proj = identity, +            indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>> _Pred> +    requires indirectly_copyable<iterator_t<_Range>, _OutIter1> && indirectly_copyable<iterator_t<_Range>, _OutIter2> +  _LIBCPP_HIDE_FROM_ABI constexpr partition_copy_result<borrowed_iterator_t<_Range>, _OutIter1, _OutIter2>    operator()(_Range&& __range, _OutIter1 __out_true, _OutIter2 __out_false, _Pred __pred, _Proj __proj = {}) const {      return __partition_copy_fn_impl(          ranges::begin(__range), ranges::end(__range), std::move(__out_true), std::move(__out_false), __pred, __proj);    } -  };  } // namespace __partition_copy  inline namespace __cpo { -  inline constexpr auto partition_copy = __partition_copy::__fn{}; +inline constexpr auto partition_copy = __partition_copy::__fn{};  } // namespace __cpo  } // namespace ranges  _LIBCPP_END_NAMESPACE_STD -#endif // _LIBCPP_STD_VER > 17 +#endif // _LIBCPP_STD_VER >= 20  #endif // _LIBCPP___ALGORITHM_RANGES_PARTITION_COPY_H | 
