template<class BidirectionalIterator>
constexpr bool next_permutation(BidirectionalIterator first,
BidirectionalIterator last);
template<class BidirectionalIterator, class Compare>
constexpr bool next_permutation(BidirectionalIterator first,
BidirectionalIterator last, Compare comp);
namespace ranges {
template<BidirectionalIterator I, Sentinel<I> S, class Comp = ranges::less<>,
class Proj = identity>
requires Sortable<I, Comp, Proj>
constexpr bool
next_permutation(I first, S last, Comp comp = {}, Proj proj = {});
template<BidirectionalRange R, class Comp = ranges::less<>,
class Proj = identity>
requires Sortable<iterator_t<R>, Comp, Proj>
constexpr bool
next_permutation(R&& r, Comp comp = {}, Proj proj = {});
}
template<class BidirectionalIterator>
constexpr bool prev_permutation(BidirectionalIterator first,
BidirectionalIterator last);
template<class BidirectionalIterator, class Compare>
constexpr bool prev_permutation(BidirectionalIterator first,
BidirectionalIterator last, Compare comp);
namespace ranges {
template<BidirectionalIterator I, Sentinel<I> S, class Comp = ranges::less<>,
class Proj = identity>
requires Sortable<I, Comp, Proj>
constexpr bool
prev_permutation(I first, S last, Comp comp = {}, Proj proj = {});
template<BidirectionalRange R, class Comp = ranges::less<>,
class Proj = identity>
requires Sortable<iterator_t<R>, Comp, Proj>
constexpr bool
prev_permutation(R&& r, Comp comp = {}, Proj proj = {});
}