brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 8d15b68 Raw
76 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___ALGORITHM_PREV_PERMUTATION_H10#define _LIBCPP___ALGORITHM_PREV_PERMUTATION_H11 12#include <__algorithm/comp.h>13#include <__algorithm/comp_ref_type.h>14#include <__algorithm/iterator_operations.h>15#include <__algorithm/reverse.h>16#include <__config>17#include <__iterator/iterator_traits.h>18#include <__utility/move.h>19#include <__utility/pair.h>20 21#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)22#  pragma GCC system_header23#endif24 25_LIBCPP_PUSH_MACROS26#include <__undef_macros>27 28_LIBCPP_BEGIN_NAMESPACE_STD29 30template <class _AlgPolicy, class _Compare, class _BidirectionalIterator, class _Sentinel>31_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<_BidirectionalIterator, bool>32__prev_permutation(_BidirectionalIterator __first, _Sentinel __last, _Compare&& __comp) {33  using _Result = pair<_BidirectionalIterator, bool>;34 35  _BidirectionalIterator __last_iter = _IterOps<_AlgPolicy>::next(__first, __last);36  _BidirectionalIterator __i         = __last_iter;37  if (__first == __last || __first == --__i)38    return _Result(std::move(__last_iter), false);39 40  while (true) {41    _BidirectionalIterator __ip1 = __i;42    if (__comp(*__ip1, *--__i)) {43      _BidirectionalIterator __j = __last_iter;44      while (!__comp(*--__j, *__i))45        ;46      _IterOps<_AlgPolicy>::iter_swap(__i, __j);47      std::__reverse<_AlgPolicy>(__ip1, __last_iter);48      return _Result(std::move(__last_iter), true);49    }50    if (__i == __first) {51      std::__reverse<_AlgPolicy>(__first, __last_iter);52      return _Result(std::move(__last_iter), false);53    }54  }55}56 57template <class _BidirectionalIterator, class _Compare>58inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool59prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last, _Compare __comp) {60  return std::__prev_permutation<_ClassicAlgPolicy>(61             std::move(__first), std::move(__last), static_cast<__comp_ref_type<_Compare> >(__comp))62      .second;63}64 65template <class _BidirectionalIterator>66inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool67prev_permutation(_BidirectionalIterator __first, _BidirectionalIterator __last) {68  return std::prev_permutation(__first, __last, __less<>());69}70 71_LIBCPP_END_NAMESPACE_STD72 73_LIBCPP_POP_MACROS74 75#endif // _LIBCPP___ALGORITHM_PREV_PERMUTATION_H76