173ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 273ebcabfSKonstantin Varlamov // 373ebcabfSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 473ebcabfSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information. 573ebcabfSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 673ebcabfSKonstantin Varlamov // 773ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===// 873ebcabfSKonstantin Varlamov 973ebcabfSKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_STABLE_PARTITION_H 1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_STABLE_PARTITION_H 1173ebcabfSKonstantin Varlamov 128ed702b8SKonstantin Varlamov #include <__algorithm/iterator_operations.h> 1373ebcabfSKonstantin Varlamov #include <__algorithm/make_projected.h> 148ed702b8SKonstantin Varlamov #include <__algorithm/ranges_iterator_concept.h> 1573ebcabfSKonstantin Varlamov #include <__algorithm/stable_partition.h> 1673ebcabfSKonstantin Varlamov #include <__config> 1773ebcabfSKonstantin Varlamov #include <__functional/identity.h> 1873ebcabfSKonstantin Varlamov #include <__functional/invoke.h> 1973ebcabfSKonstantin Varlamov #include <__functional/ranges_operations.h> 2073ebcabfSKonstantin Varlamov #include <__iterator/concepts.h> 2173ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h> 228ed702b8SKonstantin Varlamov #include <__iterator/next.h> 2373ebcabfSKonstantin Varlamov #include <__iterator/permutable.h> 2473ebcabfSKonstantin Varlamov #include <__iterator/projected.h> 2573ebcabfSKonstantin Varlamov #include <__ranges/access.h> 2673ebcabfSKonstantin Varlamov #include <__ranges/concepts.h> 2773ebcabfSKonstantin Varlamov #include <__ranges/dangling.h> 2873ebcabfSKonstantin Varlamov #include <__ranges/subrange.h> 29e698c595SNikolas Klauser #include <__type_traits/remove_cvref.h> 3073ebcabfSKonstantin Varlamov #include <__utility/forward.h> 3173ebcabfSKonstantin Varlamov #include <__utility/move.h> 3273ebcabfSKonstantin Varlamov 3373ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 3473ebcabfSKonstantin Varlamov # pragma GCC system_header 3573ebcabfSKonstantin Varlamov #endif 3673ebcabfSKonstantin Varlamov 377b462251SLouis Dionne _LIBCPP_PUSH_MACROS 387b462251SLouis Dionne #include <__undef_macros> 397b462251SLouis Dionne 404f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 4173ebcabfSKonstantin Varlamov 4273ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD 4373ebcabfSKonstantin Varlamov 4473ebcabfSKonstantin Varlamov namespace ranges { 45*d10dc5a0SChristopher Di Bella struct __stable_partition { 468ed702b8SKonstantin Varlamov template <class _Iter, class _Sent, class _Proj, class _Pred> 475aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI static subrange<__remove_cvref_t<_Iter>> 485aa03b64SLouis Dionne __stable_partition_fn_impl(_Iter&& __first, _Sent&& __last, _Pred&& __pred, _Proj&& __proj) { 498ed702b8SKonstantin Varlamov auto __last_iter = ranges::next(__first, __last); 508ed702b8SKonstantin Varlamov 51db7d7959SKonstantin Varlamov auto&& __projected_pred = std::__make_projected(__pred, __proj); 528ed702b8SKonstantin Varlamov auto __result = std::__stable_partition<_RangeAlgPolicy>( 538ed702b8SKonstantin Varlamov std::move(__first), __last_iter, __projected_pred, __iterator_concept<_Iter>()); 548ed702b8SKonstantin Varlamov 558ed702b8SKonstantin Varlamov return {std::move(__result), std::move(__last_iter)}; 568ed702b8SKonstantin Varlamov } 578ed702b8SKonstantin Varlamov 585aa03b64SLouis Dionne template <bidirectional_iterator _Iter, 595aa03b64SLouis Dionne sentinel_for<_Iter> _Sent, 605aa03b64SLouis Dionne class _Proj = identity, 6173ebcabfSKonstantin Varlamov indirect_unary_predicate<projected<_Iter, _Proj>> _Pred> 6273ebcabfSKonstantin Varlamov requires permutable<_Iter> 635aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI subrange<_Iter> operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {}) const { 648ed702b8SKonstantin Varlamov return __stable_partition_fn_impl(__first, __last, __pred, __proj); 6573ebcabfSKonstantin Varlamov } 6673ebcabfSKonstantin Varlamov 675aa03b64SLouis Dionne template <bidirectional_range _Range, 685aa03b64SLouis Dionne class _Proj = identity, 6973ebcabfSKonstantin Varlamov indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>> _Pred> 7073ebcabfSKonstantin Varlamov requires permutable<iterator_t<_Range>> 715aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI borrowed_subrange_t<_Range> 725aa03b64SLouis Dionne operator()(_Range&& __range, _Pred __pred, _Proj __proj = {}) const { 738ed702b8SKonstantin Varlamov return __stable_partition_fn_impl(ranges::begin(__range), ranges::end(__range), __pred, __proj); 7473ebcabfSKonstantin Varlamov } 7573ebcabfSKonstantin Varlamov }; 7673ebcabfSKonstantin Varlamov 7773ebcabfSKonstantin Varlamov inline namespace __cpo { 78*d10dc5a0SChristopher Di Bella inline constexpr auto stable_partition = __stable_partition{}; 7973ebcabfSKonstantin Varlamov } // namespace __cpo 8073ebcabfSKonstantin Varlamov } // namespace ranges 8173ebcabfSKonstantin Varlamov 8273ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD 8373ebcabfSKonstantin Varlamov 844f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 8573ebcabfSKonstantin Varlamov 867b462251SLouis Dionne _LIBCPP_POP_MACROS 877b462251SLouis Dionne 8873ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_STABLE_PARTITION_H 89