@@ -131,7 +131,7 @@ class [[sus_trivial_abi]] Fn<R(CallArgs...)> {
131
131
// /
132
132
// / #[doc.overloads=ctor.fnpointer]
133
133
template <__private::FunctionPointer<R, CallArgs...> F>
134
- Fn (F ptr) noexcept {
134
+ constexpr Fn (F ptr) noexcept {
135
135
::sus::check (ptr != nullptr );
136
136
storage_.fnptr = static_cast <void (*)()>(ptr);
137
137
invoke_ = &__private::Invoker<F>::template fnptr_call_const<R, CallArgs...>;
@@ -141,25 +141,23 @@ class [[sus_trivial_abi]] Fn<R(CallArgs...)> {
141
141
// /
142
142
// / #[doc.overloads=ctor.lambda]
143
143
template <__private::CallableMut<R, CallArgs...> F>
144
- Fn (F&& object) noexcept {
144
+ constexpr Fn (F&& object) noexcept {
145
145
storage_.object = ::sus::mem::addressof (object);
146
146
invoke_ = &__private::Invoker<
147
147
std::remove_reference_t <F>>::template object_call_const<R, CallArgs...>;
148
148
}
149
149
150
150
~Fn () noexcept = default ;
151
151
152
- Fn (Fn&& o) noexcept
152
+ constexpr Fn (Fn&& o) noexcept
153
153
: storage_ (o.storage_ ),
154
154
invoke_ (::sus::mem::replace_ptr (o.invoke_ , nullptr )) {
155
- // Catch use-after-move.
156
- ::sus::check (invoke_);
155
+ ::sus::check (invoke_); // Catch use-after-move.
157
156
}
158
- Fn& operator =(Fn&& o) noexcept {
157
+ constexpr Fn& operator =(Fn&& o) noexcept {
159
158
storage_ = o.storage_ ;
160
159
invoke_ = ::sus::mem::replace_ptr (o.invoke_ , nullptr );
161
- // Catch use-after-move.
162
- ::sus::check (invoke_);
160
+ ::sus::check (invoke_); // Catch use-after-move.
163
161
return *this ;
164
162
}
165
163
@@ -168,21 +166,20 @@ class [[sus_trivial_abi]] Fn<R(CallArgs...)> {
168
166
Fn& operator =(const Fn&) noexcept = delete ;
169
167
170
168
// / sus::mem::Clone trait.
171
- Fn clone () const {
172
- // Catch use-after-move.
173
- ::sus::check (invoke_);
169
+ constexpr Fn clone () const {
170
+ ::sus::check (invoke_); // Catch use-after-move.
174
171
return Fn (storage_, invoke_);
175
172
}
176
173
177
174
// / Runs the closure.
178
175
inline R operator ()(CallArgs... args) const & {
176
+ ::sus::check (invoke_); // Catch use-after-move.
179
177
return (*invoke_)(storage_, ::sus::forward<CallArgs>(args)...);
180
178
}
181
179
182
180
// / Runs and consumes the closure.
183
181
inline R operator ()(CallArgs... args) && {
184
- // Catch use-after-move.
185
- ::sus::check (invoke_);
182
+ ::sus::check (invoke_); // Catch use-after-move.
186
183
return (*::sus::mem::replace_ptr (invoke_, nullptr ))(
187
184
storage_, ::sus::forward<CallArgs>(args)...);
188
185
}
@@ -197,25 +194,14 @@ class [[sus_trivial_abi]] Fn<R(CallArgs...)> {
197
194
return Fn (::sus::forward<F>(object));
198
195
}
199
196
200
- // operator to avoid extra indirections being inserted when converting, since
201
- // otherwise an extra Invoker call would be introduced.
202
- operator FnOnce<R, CallArgs...>() && {
203
- return FnOnce (storage_, ::sus::mem::replace_ptr (invoke_, nullptr ));
204
- }
205
- // operator to avoid extra indirections being inserted when converting, since
206
- // otherwise an extra Invoker call would be introduced.
207
- operator FnMut<R, CallArgs...>() && {
208
- return FnMut (storage_, ::sus::mem::replace_ptr (invoke_, nullptr ));
209
- }
210
-
211
197
private:
212
198
template <class RR , class ... AArgs>
213
199
friend class FnOnce ;
214
200
template <class RR , class ... AArgs>
215
201
friend class FnMut ;
216
202
217
- Fn (union __private::Storage storage,
218
- __private::InvokeFnPtr<R, CallArgs...> invoke)
203
+ constexpr Fn (union __private::Storage storage,
204
+ __private::InvokeFnPtr<R, CallArgs...> invoke)
219
205
: storage_ (storage), invoke_ (invoke) {}
220
206
221
207
union __private::Storage storage_;
@@ -267,7 +253,7 @@ class [[sus_trivial_abi]] FnMut<R(CallArgs...)> {
267
253
// /
268
254
// / #[doc.overloads=ctor.fnpointer]
269
255
template <__private::FunctionPointer<R, CallArgs...> F>
270
- FnMut (F ptr) noexcept {
256
+ constexpr FnMut (F ptr) noexcept {
271
257
::sus::check (ptr != nullptr );
272
258
storage_.fnptr = static_cast <void (*)()>(ptr);
273
259
invoke_ = &__private::Invoker<F>::template fnptr_call_mut<R, CallArgs...>;
@@ -277,7 +263,7 @@ class [[sus_trivial_abi]] FnMut<R(CallArgs...)> {
277
263
// /
278
264
// / #[doc.overloads=ctor.lambda]
279
265
template <__private::CallableMut<R, CallArgs...> F>
280
- FnMut (F&& object) noexcept {
266
+ constexpr FnMut (F&& object) noexcept {
281
267
storage_.object = ::sus::mem::addressof (object);
282
268
invoke_ = &__private::Invoker<
283
269
std::remove_reference_t <F>>::template object_call_mut<R, CallArgs...>;
@@ -288,26 +274,23 @@ class [[sus_trivial_abi]] FnMut<R(CallArgs...)> {
288
274
// / Since Fn is callable, FnMut is already constructible from it, but
289
275
// / this constructor avoids extra indirections being inserted when converting,
290
276
// / since otherwise an extra invoker call would be introduced.
291
- FnMut (Fn<R (CallArgs...)>&& o) noexcept
277
+ constexpr FnMut (Fn<R (CallArgs...)>&& o) noexcept
292
278
: storage_ (o.storage_ ),
293
279
invoke_ (::sus::mem::replace_ptr (o.invoke_ , nullptr )) {
294
- // Catch use-after-move.
295
- ::sus::check (invoke_);
280
+ ::sus::check (invoke_); // Catch use-after-move.
296
281
}
297
282
298
283
~FnMut () noexcept = default ;
299
284
300
- FnMut (FnMut&& o) noexcept
285
+ constexpr FnMut (FnMut&& o) noexcept
301
286
: storage_ (o.storage_ ),
302
287
invoke_ (::sus::mem::replace_ptr (o.invoke_ , nullptr )) {
303
- // Catch use-after-move.
304
- ::sus::check (invoke_);
288
+ ::sus::check (invoke_); // Catch use-after-move.
305
289
}
306
- FnMut& operator =(FnMut&& o) noexcept {
290
+ constexpr FnMut& operator =(FnMut&& o) noexcept {
307
291
storage_ = o.storage_ ;
308
292
invoke_ = ::sus::mem::replace_ptr (o.invoke_ , nullptr );
309
- // Catch use-after-move.
310
- ::sus::check (invoke_);
293
+ ::sus::check (invoke_); // Catch use-after-move.
311
294
return *this ;
312
295
}
313
296
@@ -316,21 +299,20 @@ class [[sus_trivial_abi]] FnMut<R(CallArgs...)> {
316
299
FnMut& operator =(const FnMut&) noexcept = delete ;
317
300
318
301
// / sus::mem::Clone trait.
319
- FnMut clone () const {
320
- // Catch use-after-move.
321
- ::sus::check (invoke_);
302
+ constexpr FnMut clone () const {
303
+ ::sus::check (invoke_); // Catch use-after-move.
322
304
return FnMut (storage_, invoke_);
323
305
}
324
306
325
307
// / Runs the closure.
326
308
inline R operator ()(CallArgs... args) & {
309
+ ::sus::check (invoke_); // Catch use-after-move.
327
310
return (*invoke_)(storage_, ::sus::forward<CallArgs>(args)...);
328
311
}
329
312
330
313
// / Runs and consumes the closure.
331
314
inline R operator ()(CallArgs... args) && {
332
- // Catch use-after-move.
333
- ::sus::check (invoke_);
315
+ ::sus::check (invoke_); // Catch use-after-move.
334
316
return (*::sus::mem::replace_ptr (invoke_, nullptr ))(
335
317
storage_, ::sus::forward<CallArgs>(args)...);
336
318
}
@@ -349,7 +331,7 @@ class [[sus_trivial_abi]] FnMut<R(CallArgs...)> {
349
331
template <class RR , class ... AArgs>
350
332
friend class FnOnce ;
351
333
352
- FnMut (union __private::Storage storage,
334
+ constexpr FnMut (union __private::Storage storage,
353
335
__private::InvokeFnPtr<R, CallArgs...> invoke)
354
336
: storage_ (storage), invoke_ (invoke) {}
355
337
@@ -401,7 +383,7 @@ class [[sus_trivial_abi]] FnOnce<R(CallArgs...)> {
401
383
// /
402
384
// / #[doc.overloads=ctor.fnpointer]
403
385
template <__private::FunctionPointer<R, CallArgs...> F>
404
- FnOnce (F ptr) noexcept {
386
+ constexpr FnOnce (F ptr) noexcept {
405
387
::sus::check (ptr != nullptr );
406
388
storage_.fnptr = static_cast <void (*)()>(ptr);
407
389
invoke_ = &__private::Invoker<F>::template fnptr_call_mut<R, CallArgs...>;
@@ -411,7 +393,7 @@ class [[sus_trivial_abi]] FnOnce<R(CallArgs...)> {
411
393
// /
412
394
// / #[doc.overloads=ctor.lambda]
413
395
template <__private::CallableMut<R, CallArgs...> F>
414
- FnOnce (F&& object) noexcept {
396
+ constexpr FnOnce (F&& object) noexcept {
415
397
storage_.object = ::sus::mem::addressof (object);
416
398
invoke_ = &__private::Invoker<
417
399
std::remove_reference_t <F>>::template object_call_mut<R, CallArgs...>;
@@ -422,38 +404,34 @@ class [[sus_trivial_abi]] FnOnce<R(CallArgs...)> {
422
404
// / Since FnMut is callable, FnOnce is already constructible from it, but
423
405
// / this constructor avoids extra indirections being inserted when converting,
424
406
// / since otherwise an extra invoker call would be introduced.
425
- FnOnce (FnMut<R (CallArgs...)>&& o) noexcept
407
+ constexpr FnOnce (FnMut<R (CallArgs...)>&& o) noexcept
426
408
: storage_ (o.storage_ ),
427
409
invoke_ (::sus::mem::replace_ptr (o.invoke_ , nullptr )) {
428
- // Catch use-after-move.
429
- ::sus::check (invoke_);
410
+ ::sus::check (invoke_); // Catch use-after-move.
430
411
}
431
412
432
413
// / Construction from Fn.
433
414
// /
434
415
// / Since Fn is callable, FnOnce is already constructible from it, but
435
416
// / this constructor avoids extra indirections being inserted when converting,
436
417
// / since otherwise an extra invoker call would be introduced.
437
- FnOnce (Fn<R (CallArgs...)>&& o) noexcept
418
+ constexpr FnOnce (Fn<R (CallArgs...)>&& o) noexcept
438
419
: storage_ (o.storage_ ),
439
420
invoke_ (::sus::mem::replace_ptr (o.invoke_ , nullptr )) {
440
- // Catch use-after-move.
441
- ::sus::check (invoke_);
421
+ ::sus::check (invoke_); // Catch use-after-move.
442
422
}
443
423
444
424
~FnOnce () noexcept = default ;
445
425
446
- FnOnce (FnOnce&& o) noexcept
426
+ constexpr FnOnce (FnOnce&& o) noexcept
447
427
: storage_ (o.storage_ ),
448
428
invoke_ (::sus::mem::replace_ptr (o.invoke_ , nullptr )) {
449
- // Catch use-after-move.
450
- ::sus::check (invoke_);
429
+ ::sus::check (invoke_); // Catch use-after-move.
451
430
}
452
- FnOnce& operator =(FnOnce&& o) noexcept {
431
+ constexpr FnOnce& operator =(FnOnce&& o) noexcept {
453
432
storage_ = o.storage_ ;
454
433
invoke_ = ::sus::mem::replace_ptr (o.invoke_ , nullptr );
455
- // Catch use-after-move.
456
- ::sus::check (invoke_);
434
+ ::sus::check (invoke_); // Catch use-after-move.
457
435
return *this ;
458
436
}
459
437
@@ -463,8 +441,7 @@ class [[sus_trivial_abi]] FnOnce<R(CallArgs...)> {
463
441
464
442
// / Runs and consumes the closure.
465
443
inline R operator ()(CallArgs... args) && {
466
- // Catch use-after-move.
467
- ::sus::check (invoke_);
444
+ ::sus::check (invoke_); // Catch use-after-move.
468
445
return (*::sus::mem::replace_ptr (invoke_, nullptr ))(
469
446
storage_, ::sus::forward<CallArgs>(args)...);
470
447
}
@@ -483,8 +460,8 @@ class [[sus_trivial_abi]] FnOnce<R(CallArgs...)> {
483
460
friend FnMut<R, CallArgs...>;
484
461
friend Fn<R, CallArgs...>;
485
462
486
- FnOnce (union __private::Storage storage,
487
- __private::InvokeFnPtr<R, CallArgs...> invoke)
463
+ constexpr FnOnce (union __private::Storage storage,
464
+ __private::InvokeFnPtr<R, CallArgs...> invoke)
488
465
: storage_ (storage), invoke_ (invoke) {}
489
466
490
467
union __private::Storage storage_;
0 commit comments