Skip to content

Commit 32db84b

Browse files
committed
Use FnMut in the Array API
1 parent a9d5da0 commit 32db84b

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

subspace/containers/array.h

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
#include "subspace/containers/__private/array_marker.h"
2727
#include "subspace/containers/__private/slice_iter.h"
2828
#include "subspace/containers/slice.h"
29-
#include "subspace/fn/callable.h"
3029
#include "subspace/fn/fn_box_defn.h"
30+
#include "subspace/fn/fn_concepts.h"
31+
#include "subspace/fn/run_fn.h"
3132
#include "subspace/macros/compiler.h"
3233
#include "subspace/marker/unsafe.h"
3334
#include "subspace/mem/clone.h"
@@ -82,10 +83,11 @@ class Array final {
8283
return Array(kWithUninitialized);
8384
}
8485

85-
template <::sus::fn::callable::CallableReturns<T> InitializerFn>
86+
constexpr static Array with_initializer(::sus::fn::FnMut<T()> auto f) noexcept
8687
requires(::sus::mem::Move<T>)
87-
constexpr static Array with_initializer(InitializerFn f) noexcept {
88-
return Array(kWithInitializer, move(f), std::make_index_sequence<N>());
88+
{
89+
return Array(kWithInitializer, ::sus::move(f),
90+
std::make_index_sequence<N>());
8991
}
9092

9193
// Uses convertible_to<T> to accept `sus::into()` values. But doesn't use
@@ -282,12 +284,12 @@ class Array final {
282284
///
283285
/// To just walk each element and map them, consider using `iter()` and
284286
/// `Iterator::map`. This does not require consuming the array.
285-
template <::sus::fn::callable::CallableWith<T&&> MapFn, int&...,
286-
class R = std::invoke_result_t<MapFn, T&&>>
287-
requires(N > 0 && !std::is_void_v<R>)
287+
template <::sus::fn::FnMut<::sus::fn::NonVoid(T&&)> MapFn, int&...,
288+
class R = std::invoke_result_t<MapFn&&, T&&>>
289+
requires(N > 0)
288290
Array<R, N> map(MapFn f) && noexcept {
289291
return Array<R, N>::with_initializer([this, &f, i = size_t{0}]() mutable {
290-
return f(move(storage_.data_[i++]));
292+
return ::sus::run_mut(f, move(storage_.data_[i++]));
291293
});
292294
}
293295

@@ -302,9 +304,10 @@ class Array final {
302304

303305
private:
304306
enum WithInitializer { kWithInitializer };
305-
template <class F, size_t... Is>
306-
constexpr Array(WithInitializer, F&& f, std::index_sequence<Is...>) noexcept
307-
: storage_{((void)Is, f())...} {}
307+
template <size_t... Is>
308+
constexpr Array(WithInitializer, ::sus::fn::FnMut<T()> auto&& f,
309+
std::index_sequence<Is...>) noexcept
310+
: storage_{((void)Is, ::sus::run_mut(f))...} {}
308311

309312
enum WithValue { kWithValue };
310313
template <size_t... Is>
@@ -338,8 +341,8 @@ class Array final {
338341
};
339342

340343
sus_class_trivially_relocatable_if(::sus::marker::unsafe_fn,
341-
(N == 0 ||
342-
::sus::mem::relocate_by_memcpy<T>));
344+
(N == 0 ||
345+
::sus::mem::relocate_by_memcpy<T>));
343346
};
344347

345348
namespace __private {

0 commit comments

Comments
 (0)