26
26
#include " subspace/containers/__private/array_marker.h"
27
27
#include " subspace/containers/__private/slice_iter.h"
28
28
#include " subspace/containers/slice.h"
29
- #include " subspace/fn/callable.h"
30
29
#include " subspace/fn/fn_box_defn.h"
30
+ #include " subspace/fn/fn_concepts.h"
31
+ #include " subspace/fn/run_fn.h"
31
32
#include " subspace/macros/compiler.h"
32
33
#include " subspace/marker/unsafe.h"
33
34
#include " subspace/mem/clone.h"
@@ -82,10 +83,11 @@ class Array final {
82
83
return Array (kWithUninitialized );
83
84
}
84
85
85
- template < ::sus::fn::callable::CallableReturns<T> InitializerFn>
86
+ constexpr static Array with_initializer ( ::sus::fn::FnMut<T()> auto f) noexcept
86
87
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>());
89
91
}
90
92
91
93
// Uses convertible_to<T> to accept `sus::into()` values. But doesn't use
@@ -282,12 +284,12 @@ class Array final {
282
284
// /
283
285
// / To just walk each element and map them, consider using `iter()` and
284
286
// / `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 )
288
290
Array<R, N> map(MapFn f) && noexcept {
289
291
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++]));
291
293
});
292
294
}
293
295
@@ -302,9 +304,10 @@ class Array final {
302
304
303
305
private:
304
306
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))...} {}
308
311
309
312
enum WithValue { kWithValue };
310
313
template <size_t ... Is>
@@ -338,8 +341,8 @@ class Array final {
338
341
};
339
342
340
343
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>));
343
346
};
344
347
345
348
namespace __private {
0 commit comments