39template<
typename ForwardRange,
typename Compare = std::less<>,
typename Proj = std::
identity>
43 [&](
const auto& x,
const auto& y) {
44 return comp(std::invoke(proj, x), std::invoke(proj, y));
48template<
typename RandomAccessRange>
54template<
typename RandomAccessRange,
typename Compare>
60template<
typename RAIter,
typename Compare = std::less<>,
typename Proj>
61void sort(RAIter first, RAIter last, Compare
comp, Proj proj)
64 [&](
const auto& x,
const auto& y) {
65 return comp(std::invoke(proj, x), std::invoke(proj, y));
69template<
typename RandomAccessRange,
typename Compare = std::less<>,
typename Proj>
75template<
typename RandomAccessRange>
81template<
typename RandomAccessRange,
typename Compare>
87template<
typename RAIter,
typename Compare = std::less<>,
typename Proj>
91 [&](
const auto& x,
const auto& y) {
92 return comp(std::invoke(proj, x), std::invoke(proj, y));
96template<
typename RandomAccessRange,
typename Compare = std::less<>,
typename Proj>
102template<
typename ForwardRange,
typename T>
108template<
typename ForwardRange,
typename T,
typename Compare>
114template<
typename ForwardRange,
typename T,
typename Compare = std::less<>,
typename Proj = std::
identity>
117 auto comp2 = [&](
const auto& x,
const auto& y) {
118 return comp(std::invoke(proj, x), y);
123template<
typename ForwardRange,
typename T,
typename Compare = std::less<>,
typename Proj = std::
identity>
126 auto comp2 = [&](
const auto& x,
const auto& y) {
127 return comp(x, std::invoke(proj, y));
132template<
typename ForwardRange,
typename T,
typename Compare = std::less<>>
137template<
typename ForwardRange,
typename T,
typename Compare = std::less<>,
typename Proj = std::
identity>
141 using R =
typename std::iterator_traits<Iter>::value_type;
146 bool operator()(
const R& x,
const R& y)
const {
147 return comp(std::invoke(proj, x), std::invoke(proj, y));
149 bool operator()(
const R& x,
const T& y)
const {
150 return comp(std::invoke(proj, x), y);
152 bool operator()(
const T& x,
const R& y)
const {
153 return comp(x, std::invoke(proj, y));
159template<
typename InputRange,
typename T>
160[[nodiscard]]
auto find(InputRange&&
range,
const T& value)
165template<
typename InputRange,
typename T,
typename Proj>
166[[nodiscard]]
auto find(InputRange&&
range,
const T& value, Proj proj)
169 [&](
const auto&
e) {
return std::invoke(proj,
e) == value; });
172template<
typename InputRange,
typename UnaryPredicate>
177 for (; it != et; ++it) {
178 if (std::invoke(pred, *it)) {
185template<
typename InputRange,
typename UnaryPredicate>
191template<
typename InputRange,
typename UnaryPredicate>
197template<
typename InputRange,
typename UnaryPredicate>
203template<
typename ForwardRange>
209template<
typename ForwardRange,
typename BinaryPredicate>
210[[nodiscard]]
auto unique(ForwardRange&&
range, BinaryPredicate pred)
215template<
typename RAIter,
typename Compare = std::equal_to<>,
typename Proj>
216[[nodiscard]]
auto unique(RAIter first, RAIter last, Compare
comp, Proj proj)
219 [&](
const auto& x,
const auto& y) {
220 return comp(std::invoke(proj, x), std::invoke(proj, y));
224template<
typename RandomAccessRange,
typename Compare = std::equal_to<>,
typename Proj>
230template<
typename InputRange,
typename OutputIter>
231 requires(!range<OutputIter>)
237template<sized_range Input, sized_range Output>
238auto copy(Input&& in, Output&& out)
244template<
typename InputRange,
typename OutputIter,
typename UnaryPredicate>
250template<
typename InputRange,
typename OutputIter,
typename UnaryOperation>
256template<
typename ForwardRange,
typename Generator>
262template<
typename ForwardRange,
typename T>
268template<
typename ForwardRange,
typename UnaryPredicate>
274template<
typename ForwardRange,
typename T>
275constexpr void replace(ForwardRange&&
range,
const T& old_value,
const T& new_value)
280template<
typename ForwardRange,
typename UnaryPredicate,
typename T>
286template<
typename ForwardRange,
typename T>
287constexpr void fill(ForwardRange&&
range,
const T& value)
293template<
typename ForwardIt,
typename T>
294constexpr void iota(ForwardIt first, ForwardIt last, T value)
296 while (first != last) {
302template<
typename ForwardRange,
typename T>
308template<
typename InputRange,
typename T>
314template<
typename InputRange,
typename T,
typename BinaryOperation>
320template<
typename InputRange,
typename T>
326template<
typename InputRange,
typename UnaryPredicate>
332template<
typename InputRange1,
typename InputRange2,
typename OutputIter>
340template<range InputRange1, range InputRange2,
341 typename Pred = std::equal_to<void>,
342 typename Proj1 = std::identity,
typename Proj2 = std::identity>
343bool equal(InputRange1&& range1, InputRange2&& range2, Pred pred = {},
344 Proj1 proj1 = {}, Proj2 proj2 = {})
350 for (; (it1 != et1) && (it2 != et2); ++it1, ++it2) {
351 if (!std::invoke(pred, std::invoke(proj1, *it1), std::invoke(proj2, *it2))) {
355 return (it1 == et1) && (it2 == et2);
358template<sized_range SizedRange1, sized_range SizedRange2,
359 typename Pred = std::equal_to<void>,
360 typename Proj1 = std::identity,
typename Proj2 = std::identity>
361bool equal(SizedRange1&& range1, SizedRange2&& range2, Pred pred = {},
362 Proj1 proj1 = {}, Proj2 proj2 = {})
369 for (; it1 != et1; ++it1, ++it2) {
370 if (!std::invoke(pred, std::invoke(proj1, *it1), std::invoke(proj2, *it2))) {
379template<
typename InputRange,
typename Proj = std::
identity>
384 if (it == et)
return true;
386 auto val = std::invoke(proj, *it);
387 for (++it; it != et; ++it) {
388 if (std::invoke(proj, *it) != val) {
412template<
typename ForwardRange,
typename T,
typename Compare = std::less<>,
typename Proj = std::
identity>
413[[nodiscard]]
auto*
binary_find(ForwardRange&& range,
const T& value, Compare
comp = {}, Proj proj = {})
416 return ((it !=
std::end(range)) && (!std::invoke(
comp, value, std::invoke(proj, *it))))
426template<
typename Range>
429#ifndef _LIBCPP_VERSION
432 return std::span(range);
445template<
typename Range>
446constexpr auto subspan(Range&& range,
size_t offset,
size_t count = std::dynamic_extent)
448 return make_span(std::forward<Range>(range)).subspan(offset,
count);
451template<
size_t Count,
typename Range>
452constexpr auto subspan(Range&& range,
size_t offset = 0)
454 return make_span(std::forward<Range>(range)).subspan(offset).template first<Count>();
bool comp(const uint8_t *p, const uint8_t *q)
bool is_sorted(ForwardRange &&range, Compare comp={}, Proj proj={})
bool binary_search(ForwardRange &&range, const T &value)
bool any_of(InputRange &&range, UnaryPredicate pred)
auto unique(ForwardRange &&range)
bool all_of(InputRange &&range, UnaryPredicate pred)
constexpr void fill(ForwardRange &&range, const T &value)
auto remove(ForwardRange &&range, const T &value)
void replace_if(ForwardRange &&range, UnaryPredicate pred, const T &new_value)
void stable_sort(RandomAccessRange &&range, Compare comp, Proj proj)
bool all_equal(InputRange &&range, Proj proj={})
void sort(RandomAccessRange &&range, Compare comp, Proj proj)
auto find_if(InputRange &&range, UnaryPredicate pred)
bool binary_search(ForwardRange &&range, const T &value, Compare comp)
bool none_of(InputRange &&range, UnaryPredicate pred)
auto copy(InputRange &&range, OutputIter out)
auto count(InputRange &&range, const T &value)
auto find(InputRange &&range, const T &value, Proj proj)
auto copy(Input &&in, Output &&out)
auto equal_range(ForwardRange &&range, const T &value, Compare comp, Proj proj)
auto remove_if(ForwardRange &&range, UnaryPredicate pred)
constexpr void iota(ForwardIt first, ForwardIt last, T value)
T accumulate(InputRange &&range, T init)
void stable_sort(RandomAccessRange &&range)
auto find(InputRange &&range, const T &value)
bool equal(InputRange1 &&range1, InputRange2 &&range2, Pred pred={}, Proj1 proj1={}, Proj2 proj2={})
auto unique(RandomAccessRange &&range, Compare comp, Proj proj)
auto upper_bound(ForwardRange &&range, const T &value, Compare comp={}, Proj proj={})
auto equal_range(ForwardRange &&range, const T &value, Compare comp={})
auto set_difference(InputRange1 &&range1, InputRange2 &&range2, OutputIter out)
void generate(ForwardRange &&range, Generator &&g)
constexpr void iota(ForwardRange &&range, T &&value)
auto transform(InputRange &&range, OutputIter out, UnaryOperation op)
auto copy_if(InputRange &&range, OutputIter out, UnaryPredicate pred)
constexpr void replace(ForwardRange &&range, const T &old_value, const T &new_value)
T accumulate(InputRange &&range, T init, BinaryOperation op)
constexpr void sort(RandomAccessRange &&range)
auto lower_bound(ForwardRange &&range, const T &value, Compare comp={}, Proj proj={})
auto count_if(InputRange &&range, UnaryPredicate pred)
size_t size(std::string_view utf8)
constexpr auto make_span(Range &&range)
constexpr auto subspan(Range &&range, size_t offset, size_t count=std::dynamic_extent)
auto * binary_find(ForwardRange &&range, const T &value, Compare comp={}, Proj proj={})
constexpr auto begin(const zstring_view &x)
constexpr auto end(const zstring_view &x)