xref: /llvm-project/libcxx/include/__algorithm/ranges_next_permutation.h (revision d10dc5a06fac4dcabf2264c64c8672c6f6ae36fb)
168264b64SNikolas Klauser //===----------------------------------------------------------------------===//
268264b64SNikolas Klauser //
368264b64SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
468264b64SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
568264b64SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
668264b64SNikolas Klauser //
768264b64SNikolas Klauser //===----------------------------------------------------------------------===//
868264b64SNikolas Klauser 
968264b64SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_NEXT_PERMUTATION_H
1068264b64SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_NEXT_PERMUTATION_H
1168264b64SNikolas Klauser 
1268264b64SNikolas Klauser #include <__algorithm/in_found_result.h>
1368264b64SNikolas Klauser #include <__algorithm/iterator_operations.h>
1468264b64SNikolas Klauser #include <__algorithm/make_projected.h>
1568264b64SNikolas Klauser #include <__algorithm/next_permutation.h>
1668264b64SNikolas Klauser #include <__config>
1768264b64SNikolas Klauser #include <__functional/identity.h>
1868264b64SNikolas Klauser #include <__functional/ranges_operations.h>
1968264b64SNikolas Klauser #include <__iterator/concepts.h>
2068264b64SNikolas Klauser #include <__iterator/sortable.h>
2168264b64SNikolas Klauser #include <__ranges/access.h>
2268264b64SNikolas Klauser #include <__ranges/concepts.h>
2368264b64SNikolas Klauser #include <__ranges/dangling.h>
2468264b64SNikolas Klauser #include <__utility/move.h>
25d5e26775SNikolas Klauser #include <__utility/pair.h>
2668264b64SNikolas Klauser 
2768264b64SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2868264b64SNikolas Klauser #  pragma GCC system_header
2968264b64SNikolas Klauser #endif
3068264b64SNikolas Klauser 
317b462251SLouis Dionne _LIBCPP_PUSH_MACROS
327b462251SLouis Dionne #include <__undef_macros>
337b462251SLouis Dionne 
344f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3568264b64SNikolas Klauser 
3668264b64SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
3768264b64SNikolas Klauser 
3868264b64SNikolas Klauser namespace ranges {
3968264b64SNikolas Klauser 
4068264b64SNikolas Klauser template <class _InIter>
4168264b64SNikolas Klauser using next_permutation_result = in_found_result<_InIter>;
4268264b64SNikolas Klauser 
43*d10dc5a0SChristopher Di Bella struct __next_permutation {
4468264b64SNikolas Klauser   template <bidirectional_iterator _Iter, sentinel_for<_Iter> _Sent, class _Comp = ranges::less, class _Proj = identity>
4568264b64SNikolas Klauser     requires sortable<_Iter, _Comp, _Proj>
4668264b64SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI constexpr next_permutation_result<_Iter>
4768264b64SNikolas Klauser   operator()(_Iter __first, _Sent __last, _Comp __comp = {}, _Proj __proj = {}) const {
4868264b64SNikolas Klauser     auto __result = std::__next_permutation<_RangeAlgPolicy>(
4968264b64SNikolas Klauser         std::move(__first), std::move(__last), std::__make_projected(__comp, __proj));
5068264b64SNikolas Klauser     return {std::move(__result.first), std::move(__result.second)};
5168264b64SNikolas Klauser   }
5268264b64SNikolas Klauser 
5368264b64SNikolas Klauser   template <bidirectional_range _Range, class _Comp = ranges::less, class _Proj = identity>
5468264b64SNikolas Klauser     requires sortable<iterator_t<_Range>, _Comp, _Proj>
5568264b64SNikolas Klauser   _LIBCPP_HIDE_FROM_ABI constexpr next_permutation_result<borrowed_iterator_t<_Range>>
5668264b64SNikolas Klauser   operator()(_Range&& __range, _Comp __comp = {}, _Proj __proj = {}) const {
5768264b64SNikolas Klauser     auto __result = std::__next_permutation<_RangeAlgPolicy>(
5868264b64SNikolas Klauser         ranges::begin(__range), ranges::end(__range), std::__make_projected(__comp, __proj));
5968264b64SNikolas Klauser     return {std::move(__result.first), std::move(__result.second)};
6068264b64SNikolas Klauser   }
6168264b64SNikolas Klauser };
6268264b64SNikolas Klauser 
6368264b64SNikolas Klauser inline namespace __cpo {
64*d10dc5a0SChristopher Di Bella constexpr inline auto next_permutation = __next_permutation{};
6568264b64SNikolas Klauser } // namespace __cpo
6668264b64SNikolas Klauser } // namespace ranges
6768264b64SNikolas Klauser 
6868264b64SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
6968264b64SNikolas Klauser 
704f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
7168264b64SNikolas Klauser 
727b462251SLouis Dionne _LIBCPP_POP_MACROS
737b462251SLouis Dionne 
7468264b64SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_NEXT_PERMUTATION_H
75