diff options
Diffstat (limited to 'libcxx/include/__algorithm/ranges_inplace_merge.h')
| -rw-r--r-- | libcxx/include/__algorithm/ranges_inplace_merge.h | 56 | 
1 files changed, 34 insertions, 22 deletions
| diff --git a/libcxx/include/__algorithm/ranges_inplace_merge.h b/libcxx/include/__algorithm/ranges_inplace_merge.h index a0867e486c3a..88171a65c8e9 100644 --- a/libcxx/include/__algorithm/ranges_inplace_merge.h +++ b/libcxx/include/__algorithm/ranges_inplace_merge.h @@ -10,6 +10,7 @@  #define _LIBCPP___ALGORITHM_RANGES_INPLACE_MERGE_H  #include <__algorithm/inplace_merge.h> +#include <__algorithm/iterator_operations.h>  #include <__algorithm/make_projected.h>  #include <__config>  #include <__functional/identity.h> @@ -17,6 +18,7 @@  #include <__functional/ranges_operations.h>  #include <__iterator/concepts.h>  #include <__iterator/iterator_traits.h> +#include <__iterator/next.h>  #include <__iterator/projected.h>  #include <__iterator/sortable.h>  #include <__ranges/access.h> @@ -29,35 +31,45 @@  #  pragma GCC system_header  #endif -#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) +#if _LIBCPP_STD_VER > 17  _LIBCPP_BEGIN_NAMESPACE_STD  namespace ranges {  namespace __inplace_merge { -struct __fn { +  struct __fn { +    template <class _Iter, class _Sent, class _Comp, class _Proj> +    _LIBCPP_HIDE_FROM_ABI static constexpr auto +    __inplace_merge_impl(_Iter __first, _Iter __middle, _Sent __last, _Comp&& __comp, _Proj&& __proj) { +      auto __last_iter = ranges::next(__middle, __last); +      std::__inplace_merge<_RangeAlgPolicy>( +          std::move(__first), std::move(__middle), __last_iter, std::__make_projected(__comp, __proj)); +      return __last_iter; +    } -  template <bidirectional_iterator _Iter, sentinel_for<_Iter> _Sent, class _Comp = ranges::less, class _Proj = identity> -  requires sortable<_Iter, _Comp, _Proj> -  _LIBCPP_HIDE_FROM_ABI -  _Iter operator()(_Iter __first, _Iter __middle, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { -    // TODO: implement -    (void)__first; (void)__middle; (void)__last; (void)__comp; (void)__proj; -    return {}; -  } +    template < +        bidirectional_iterator _Iter, +        sentinel_for<_Iter> _Sent, +        class _Comp = ranges::less, +        class _Proj = identity> +      requires sortable<_Iter, _Comp, _Proj> +    _LIBCPP_HIDE_FROM_ABI _Iter +    operator()(_Iter __first, _Iter __middle, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { +      return __inplace_merge_impl( +          std::move(__first), std::move(__middle), std::move(__last), std::move(__comp), std::move(__proj)); +    } -  template <bidirectional_range _Range, class _Comp = ranges::less, class _Proj = identity> -  requires sortable<iterator_t<_Range>, _Comp, _Proj> -  _LIBCPP_HIDE_FROM_ABI -  borrowed_iterator_t<_Range> operator()(_Range&& __range, iterator_t<_Range> __middle, -                                            _Comp __comp = {}, _Proj __proj = {}) const { -    // TODO: implement -    (void)__range; (void)__middle; (void)__comp; (void)__proj; -    return {}; -  } - -}; +    template <bidirectional_range _Range, class _Comp = ranges::less, class _Proj = identity> +      requires sortable< +          iterator_t<_Range>, +          _Comp, +          _Proj> _LIBCPP_HIDE_FROM_ABI borrowed_iterator_t<_Range> +      operator()(_Range&& __range, iterator_t<_Range> __middle, _Comp __comp = {}, _Proj __proj = {}) const { +      return __inplace_merge_impl( +          ranges::begin(__range), std::move(__middle), ranges::end(__range), std::move(__comp), std::move(__proj)); +    } +  };  } // namespace __inplace_merge @@ -68,6 +80,6 @@ inline namespace __cpo {  _LIBCPP_END_NAMESPACE_STD -#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_INCOMPLETE_RANGES) +#endif // _LIBCPP_STD_VER > 17  #endif // _LIBCPP___ALGORITHM_RANGES_INPLACE_MERGE_H | 
