1ff3989e6SKonstantin Varlamov //===----------------------------------------------------------------------===// 2ff3989e6SKonstantin Varlamov // 3ff3989e6SKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4ff3989e6SKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information. 5ff3989e6SKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ff3989e6SKonstantin Varlamov // 7ff3989e6SKonstantin Varlamov //===----------------------------------------------------------------------===// 8ff3989e6SKonstantin Varlamov 9ff3989e6SKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_SORT_H 10ff3989e6SKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_SORT_H 11ff3989e6SKonstantin Varlamov 12a7c3379cSKonstantin Varlamov #include <__algorithm/iterator_operations.h> 13ff3989e6SKonstantin Varlamov #include <__algorithm/make_projected.h> 14ff3989e6SKonstantin Varlamov #include <__algorithm/sort.h> 15ff3989e6SKonstantin Varlamov #include <__config> 16ff3989e6SKonstantin Varlamov #include <__functional/identity.h> 17ff3989e6SKonstantin Varlamov #include <__functional/invoke.h> 18ff3989e6SKonstantin Varlamov #include <__functional/ranges_operations.h> 19ff3989e6SKonstantin Varlamov #include <__iterator/concepts.h> 20ff3989e6SKonstantin Varlamov #include <__iterator/iterator_traits.h> 21ff3989e6SKonstantin Varlamov #include <__iterator/next.h> 22ff3989e6SKonstantin Varlamov #include <__iterator/projected.h> 23ff3989e6SKonstantin Varlamov #include <__iterator/sortable.h> 24ff3989e6SKonstantin Varlamov #include <__ranges/access.h> 25ff3989e6SKonstantin Varlamov #include <__ranges/concepts.h> 26ff3989e6SKonstantin Varlamov #include <__ranges/dangling.h> 27ff3989e6SKonstantin Varlamov #include <__utility/forward.h> 28ff3989e6SKonstantin Varlamov #include <__utility/move.h> 29ff3989e6SKonstantin Varlamov 30ff3989e6SKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 31ff3989e6SKonstantin Varlamov # pragma GCC system_header 32ff3989e6SKonstantin Varlamov #endif 33ff3989e6SKonstantin Varlamov 347b462251SLouis Dionne _LIBCPP_PUSH_MACROS 357b462251SLouis Dionne #include <__undef_macros> 367b462251SLouis Dionne 374f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20 38ff3989e6SKonstantin Varlamov 39ff3989e6SKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD 40ff3989e6SKonstantin Varlamov 41ff3989e6SKonstantin Varlamov namespace ranges { 42*d10dc5a0SChristopher Di Bella struct __sort { 43ff3989e6SKonstantin Varlamov template <class _Iter, class _Sent, class _Comp, class _Proj> 445aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr static _Iter 455aa03b64SLouis Dionne __sort_fn_impl(_Iter __first, _Sent __last, _Comp& __comp, _Proj& __proj) { 46ff3989e6SKonstantin Varlamov auto __last_iter = ranges::next(__first, __last); 47ff3989e6SKonstantin Varlamov 48db7d7959SKonstantin Varlamov auto&& __projected_comp = std::__make_projected(__comp, __proj); 49a7c3379cSKonstantin Varlamov std::__sort_impl<_RangeAlgPolicy>(std::move(__first), __last_iter, __projected_comp); 50ff3989e6SKonstantin Varlamov 51ff3989e6SKonstantin Varlamov return __last_iter; 52ff3989e6SKonstantin Varlamov } 53ff3989e6SKonstantin Varlamov 54ff3989e6SKonstantin Varlamov template <random_access_iterator _Iter, sentinel_for<_Iter> _Sent, class _Comp = ranges::less, class _Proj = identity> 55ff3989e6SKonstantin Varlamov requires sortable<_Iter, _Comp, _Proj> 565aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr _Iter 575aa03b64SLouis Dionne operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const { 58ff3989e6SKonstantin Varlamov return __sort_fn_impl(std::move(__first), std::move(__last), __comp, __proj); 59ff3989e6SKonstantin Varlamov } 60ff3989e6SKonstantin Varlamov 61ff3989e6SKonstantin Varlamov template <random_access_range _Range, class _Comp = ranges::less, class _Proj = identity> 62ff3989e6SKonstantin Varlamov requires sortable<iterator_t<_Range>, _Comp, _Proj> 635aa03b64SLouis Dionne _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_Range> 645aa03b64SLouis Dionne operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {}) const { 65ff3989e6SKonstantin Varlamov return __sort_fn_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj); 66ff3989e6SKonstantin Varlamov } 67ff3989e6SKonstantin Varlamov }; 68ff3989e6SKonstantin Varlamov 69ff3989e6SKonstantin Varlamov inline namespace __cpo { 70*d10dc5a0SChristopher Di Bella inline constexpr auto sort = __sort{}; 71ff3989e6SKonstantin Varlamov } // namespace __cpo 72ff3989e6SKonstantin Varlamov } // namespace ranges 73ff3989e6SKonstantin Varlamov 74ff3989e6SKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD 75ff3989e6SKonstantin Varlamov 764f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 77ff3989e6SKonstantin Varlamov 787b462251SLouis Dionne _LIBCPP_POP_MACROS 797b462251SLouis Dionne 80ff3989e6SKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_SORT_H 81