Skip to content

Commit a9d5da0

Browse files
committed
Use FnMut in the Slice (and Vec) APIs
1 parent 7a23bf6 commit a9d5da0

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

subspace/containers/slice.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
#include "subspace/assertions/check.h"
2424
#include "subspace/construct/into.h"
2525
#include "subspace/containers/__private/slice_iter.h"
26-
#include "subspace/fn/callable.h"
26+
#include "subspace/fn/fn_concepts.h"
27+
#include "subspace/fn/run_fn.h"
2728
#include "subspace/iter/iterator_defn.h"
2829
#include "subspace/macros/lifetimebound.h"
2930
#include "subspace/marker/unsafe.h"
@@ -236,16 +237,17 @@ class [[sus_trivial_abi]] Slice {
236237
/// unspecified.
237238
//
238239
// TODO: Rust's stable sort is O(n * log(n)), so this can be improved.
239-
template <class F, int&...,
240-
class R = std::invoke_result_t<F, const T&, const T&>>
240+
template <::sus::fn::FnMut<::sus::fn::Anything(const T&, const T&)> F,
241+
int&..., class R = std::invoke_result_t<F, const T&, const T&>>
241242
requires(::sus::ops::Ordering<R>)
242243
void sort_by(F compare) noexcept
243244
requires(!std::is_const_v<T>)
244245
{
245246
if (len_ > 0_usize) {
246-
std::stable_sort(
247-
data_, data_ + size_t{len_},
248-
[&compare](const T& l, const T& r) { return compare(l, r) < 0; });
247+
std::stable_sort(data_, data_ + size_t{len_},
248+
[&compare](const T& l, const T& r) {
249+
return ::sus::run_mut(compare, l, r) < 0;
250+
});
249251
}
250252
}
251253

@@ -270,16 +272,17 @@ class [[sus_trivial_abi]] Slice {
270272
/// The comparator function must define a total ordering for the elements in
271273
/// the slice. If the ordering is not total, the order of the elements is
272274
/// unspecified.
273-
template <class F, int&...,
274-
class R = std::invoke_result_t<F, const T&, const T&>>
275+
template <::sus::fn::FnMut<::sus::fn::Anything(const T&, const T&)> F,
276+
int&..., class R = std::invoke_result_t<F, const T&, const T&>>
275277
requires(::sus::ops::Ordering<R>)
276278
void sort_unstable_by(F compare) noexcept
277279
requires(!std::is_const_v<T>)
278280
{
279281
if (len_ > 0_usize) {
280-
std::sort(
281-
data_, data_ + size_t{len_},
282-
[&compare](const T& l, const T& r) { return compare(l, r) < 0; });
282+
std::sort(data_, data_ + size_t{len_},
283+
[&compare](const T& l, const T& r) {
284+
return ::sus::run_mut(compare, l, r) < 0;
285+
});
283286
}
284287
}
285288

subspace/containers/vec.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -446,21 +446,21 @@ class Vec {
446446
void sort() { as_mut_slice().sort(); }
447447

448448
/// #[doc.inherit=[n]sus::[n]containers::[r]Slice::[f]sort_by]
449-
template <::sus::fn::FnOnce<::sus::fn::NonVoid(const T&, const T&)> F,
449+
template <::sus::fn::FnMut<::sus::fn::NonVoid(const T&, const T&)> F,
450450
int&..., class R = std::invoke_result_t<F, const T&, const T&>>
451451
requires(::sus::ops::Ordering<R>)
452-
void sort_by(F&& compare) {
452+
void sort_by(F compare) {
453453
as_mut_slice().sort_by(sus::move(compare));
454454
}
455455

456456
/// #[doc.inherit=[n]sus::[n]containers::[r]Slice::[f]sort_unstable]
457457
void sort_unstable() { as_mut_slice().sort(); }
458458

459459
/// #[doc.inherit=[n]sus::[n]containers::[r]Slice::[f]sort_unstable_by]
460-
template <::sus::fn::FnOnce<::sus::fn::NonVoid(const T&, const T&)> F,
460+
template <::sus::fn::FnMut<::sus::fn::NonVoid(const T&, const T&)> F,
461461
int&..., class R = std::invoke_result_t<F, const T&, const T&>>
462462
requires(::sus::ops::Ordering<R>)
463-
void sort_unstable_by(F&& compare) {
463+
void sort_unstable_by(F compare) {
464464
as_mut_slice().sort_by(sus::move(compare));
465465
}
466466

0 commit comments

Comments
 (0)