xref: /llvm-project/libcxx/include/__algorithm/ranges_sort.h (revision d10dc5a06fac4dcabf2264c64c8672c6f6ae36fb)
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