29 template<
typename Function>
32 template<
typename R,
typename... Args>
36 template<
typename... Fs>
48 template<
typename R,
typename... Args>
52 template<
typename... Fs>
64 template<
typename R,
typename... Args>
68 template<
typename... Fs>
80 template<
typename R,
typename... Args>
84 template<
typename... Fs>
96 template<
typename R,
typename... Args>
100 template<
typename... Fs>
112 template<
typename R,
typename... Args>
116 template<
typename... Fs>
128 template<
typename R,
typename... Args>
132 template<
typename... Fs>
144 template<
typename R,
typename... Args>
148 template<
typename... Fs>
160 template<
typename R,
typename... Args>
164 template<
typename... Fs>
176 template<
typename R,
typename... Args>
180 template<
typename... Fs>
192 template<
typename R,
typename... Args>
196 template<
typename... Fs>
208 template<
typename R,
typename... Args>
212 template<
typename... Fs>
238 template<concepts::Allocator Alloc>
251 auto* a_value =
static_cast<T*
>(a->
pointer);
260 auto* b_value =
static_cast<T*
>(b->
address());
273 auto* a_value =
static_cast<T*
>(a->
pointer);
287 m_thunk(util::addressof(m_storage), util::addressof(other.m_storage), m_allocator);
298 m_thunk(util::addressof(m_storage), util::addressof(other.m_storage), m_allocator);
303 constexpr auto empty() const ->
bool {
return m_thunk !=
nullptr; }
306 old_thunk(util::addressof(m_storage),
nullptr, m_allocator);
313 return static_cast<T*
>(m_storage.pointer);
316 return static_cast<T*
>(m_storage.address());
318 return static_cast<T*
>(m_storage.pointer);
325 return static_cast<T*
>(m_storage.pointer);
328 return static_cast<T*
>(m_storage.address());
330 return static_cast<T*
>(m_storage.pointer);
334 template<
typename T,
typename... Args>
341 m_thunk = &concrete_thunk<T>;
345 template<
typename T,
typename... Args>
348 m_thunk = &concrete_thunk<T>;
355 ThunkFunction m_thunk {
nullptr };
356 ErasedStorage m_storage;
357 [[no_unique_address]] Alloc m_allocator {};
360 template<
typename T, concepts::Allocator = platform::DefaultAllocator>
370 template<
typename, concepts::Allocator>
377 template<
typename... Fs>
378 constexpr static bool is_invocable = Info::template is_invocable<Fs...>;
380 constexpr static bool is_noexcept = Info::is_noexcept;
383 using CVQualified = Info::template CVQualified<T>;
386 using RefQualified = Info::template RefQualified<T>;
389 using Qualified = RefQualified<CVQualified<T>>;
398 template<
typename VT>
399 constexpr static bool is_callable_from = is_invocable<Qualified<VT>> && is_invocable<InvQualifed<VT>>;
401 template<auto f,
typename VT>
402 constexpr static bool is_callable_as_if_from = is_invocable<
decltype(f), InvQualifed<VT>>;
408 Args&&... args)
noexcept(is_noexcept) -> R {
409 using CV = CVQualified<T>;
410 using Inv = InvQualifed<T>;
412 util::forward<Args>(args)...);
417 Args&&... args)
noexcept(is_noexcept) -> R {
421 template<auto f,
typename T>
423 Args&&... args) -> R {
424 using CV = CVQualified<T>;
425 using Inv = InvQualifed<T>;
427 util::forward<Args>(args)...);
436 : m_object(
util::move(other.m_object)), m_impl(
util::
exchange(other.m_impl, nullptr)) {}
439 requires(is_invocable<
decltype(f)>)
441 m_impl = &concrete_impl_for_constexpr<f>;
444 template<
typename F,
typename VT = meta::Decay<F>>
450 if (
object ==
nullptr) {
454 m_object.template init_inline<VT>(util::forward<F>(
object));
455 m_impl = &concrete_impl<VT>;
458 template<auto f,
typename T,
typename VT = meta::Decay<T>>
461 m_object.template init_inline<VT>(util::forward<T>(
object));
462 m_impl = &concrete_impl_for_bound_constexpr<f, VT>;
465 template<
typename T,
typename... Ts,
typename VT =
meta::Decay<T>>
468 m_object.template init_inline<VT>(util::forward<Ts>(args)...);
469 m_impl = &concrete_impl<VT>;
472 template<
typename T,
typename U,
typename... Ts,
typename VT =
meta::Decay<T>>
476 m_object.template init_inline<VT>(list, util::forward<Ts>(args)...);
477 m_impl = &concrete_impl<VT>;
480 template<
auto f,
typename T,
typename... Ts,
typename VT =
meta::Decay<T>>
483 m_object.template init_inline<VT>(util::forward<Ts>(args)...);
484 m_impl = &concrete_impl_for_bound_constexpr<f, VT>;
487 template<
auto f,
typename T,
typename U,
typename... Ts,
typename VT =
meta::Decay<T>>
491 m_object.template init_inline<VT>(list, util::forward<Ts>(args)...);
492 m_impl = &concrete_impl_for_bound_constexpr<f, VT>;
504 m_object = util::move(other.m_object);
517 constexpr auto operator()(Args... args)
noexcept(is_noexcept) -> R
518 requires(!is_const && !is_lvalue && !is_rvalue)
521 return m_impl(util::addressof(m_object), util::forward<Args>(args)...);
524 constexpr auto operator()(Args... args)
const noexcept(is_noexcept) -> R
525 requires(is_const && !is_lvalue && !is_rvalue)
528 return m_impl(util::addressof(m_object), util::forward<Args>(args)...);
531 constexpr auto operator()(Args... args) &
noexcept(is_noexcept) -> R
532 requires(!is_const && is_lvalue)
535 return m_impl(util::addressof(m_object), util::forward<Args>(args)...);
538 constexpr auto operator()(Args... args)
const&
noexcept(is_noexcept) -> R
539 requires(is_const && is_lvalue)
542 return m_impl(util::addressof(m_object), util::forward<Args>(args)...);
545 constexpr auto operator()(Args... args) &&
noexcept(is_noexcept) -> R
546 requires(!is_const && is_rvalue)
549 return m_impl(util::addressof(m_object), util::forward<Args>(args)...);
552 constexpr auto operator()(Args... args)
const&&
noexcept(is_noexcept) -> R
553 requires(is_const && is_rvalue)
556 return m_impl(util::addressof(m_object), util::forward<Args>(args)...);
559 constexpr explicit operator bool()
const {
return m_impl !=
nullptr; }
565 ErasedFunctionPointer m_impl {
nullptr };
568 template<
typename Signature, concepts::Allocator Alloc>
574 template<
typename F,
typename VT = meta::Decay<F>>
581 if (
object ==
nullptr) {
586 result.m_object.template init_inline<VT>(util::forward<F>(
object));
588 DI_TRY(result.m_object.template init_out_of_line<VT>(util::forward<F>(
object)));
590 result.m_object.template init_out_of_line<VT>(util::forward<F>(
object));
592 result.m_impl = &Function::template concrete_impl<VT>;
596 template<auto f,
typename T,
typename VT = meta::Decay<T>>
601 result.m_object.template init_inline<VT>(util::forward<T>(
object));
603 DI_TRY(result.m_object.template init_out_of_line_fallible<VT>(util::forward<T>(
object)));
605 result.m_object.template init_out_of_line<VT>(util::forward<T>(
object));
607 result.m_impl = &Function::template concrete_impl_for_bound_constexpr<f, VT>;
611 template<
typename T,
typename... Ts,
typename VT =
meta::Decay<T>>
616 result.m_object.template init_inline<VT>(util::forward<Ts>(args)...);
618 DI_TRY(result.m_object.template init_out_of_line_fallible<VT>(util::forward<Ts>(args)...));
620 result.m_object.template init_out_of_line<VT>(util::forward<Ts>(args)...);
622 result.m_impl = &Function::template concrete_impl<VT>;
626 template<
typename T,
typename U,
typename... Ts,
typename VT =
meta::Decay<T>>
628 Function::template is_callable_from<VT>)
629 constexpr auto operator()(
InPlaceType<T>, std::initializer_list<U> list, Ts&&... args)
const
633 result.m_object.template init_inline<VT>(list, util::forward<Ts>(args)...);
635 DI_TRY(result.m_object.template init_out_of_line_fallible<VT>(list, util::forward<Ts>(args)...));
637 result.m_object.template init_out_of_line<VT>(list, util::forward<Ts>(args)...);
639 result.m_impl = &Function::template concrete_impl<VT>;
643 template<
auto f,
typename T,
typename... Ts,
typename VT =
meta::Decay<T>>
649 result.m_object.template init_inline<VT>(util::forward<Ts>(args)...);
651 DI_TRY(result.m_object.template init_out_of_line_fallible<VT>(util::forward<Ts>(args)...));
653 result.m_object.template init_out_of_line<VT>(util::forward<Ts>(args)...);
655 result.m_impl = &Function::template concrete_impl_for_bound_constexpr<f, VT>;
659 template<
auto f,
typename T,
typename U,
typename... Ts,
typename VT =
meta::Decay<T>>
666 result.m_object.template init_inline<VT>(list, util::forward<Ts>(args)...);
668 DI_TRY(result.m_object.template init_out_of_line_fallible<VT>(list, util::forward<Ts>(args)...));
670 result.m_object.template init_out_of_line<VT>(list, util::forward<Ts>(args)...);
672 result.m_impl = &Function::template concrete_impl_for_bound_constexpr<f, VT>;
678using function_ns::Function;
680template<concepts::LanguageFunction T, concepts::Allocator Alloc = platform::DefaultAllocator>
685using function::Function;
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition function.h:365
constexpr Function(Constexpr< f >, T &&object)
Definition function.h:460
constexpr auto operator()(Args... args) noexcept(is_noexcept) -> R requires(!is_const &&!is_lvalue &&!is_rvalue)
Definition function.h:517
constexpr Function(Constexpr< f >, InPlaceType< T >, std::initializer_list< U > list, Ts &&... args)
Definition function.h:490
constexpr Function(nullptr_t)
Definition function.h:432
Function(Function const &)=delete
auto operator=(Function const &) -> Function &=delete
constexpr auto operator=(Function &&other) -> Function &
Definition function.h:503
constexpr Function(Constexpr< f >, InPlaceType< T >, Ts &&... args)
Definition function.h:482
constexpr Function(Function &&other)
Definition function.h:435
constexpr auto operator()(Args... args) &&noexcept(is_noexcept) -> R requires(!is_const &&is_rvalue)
Definition function.h:545
constexpr auto operator()(Args... args) const &&noexcept(is_noexcept) -> R requires(is_const &&is_rvalue)
Definition function.h:552
constexpr auto operator()(Args... args) const &noexcept(is_noexcept) -> R requires(is_const &&is_lvalue)
Definition function.h:538
constexpr Function(InPlaceType< T >, Ts &&... args)
Definition function.h:467
constexpr Function(InPlaceType< T >, std::initializer_list< U > list, Ts &&... args)
Definition function.h:475
constexpr friend auto operator==(Function const &a, nullptr_t) -> bool
Definition function.h:562
constexpr auto operator=(nullptr_t) -> Function &
Definition function.h:497
constexpr Function(F &&object)
Definition function.h:447
constexpr Function(Constexpr< f >)
Definition function.h:440
friend struct MakeFunction
Definition function.h:371
constexpr auto operator()(Args... args) &noexcept(is_noexcept) -> R requires(!is_const &&is_lvalue)
Definition function.h:531
constexpr auto operator()(Args... args) const noexcept(is_noexcept) -> R requires(is_const &&!is_lvalue &&!is_rvalue)
Definition function.h:524
Definition operations.h:11
Definition allocator.h:20
Definition language.h:171
Definition operations.h:43
Definition function.h:235
#define DI_TRY(...)
Definition monad_try.h:13
constexpr auto make_function
Definition function.h:681
constexpr auto invoke_r
Definition invoke.h:103
constexpr auto value
Definition value.h:34
std::byte Byte
Definition byte.h:63
std::nullptr_t nullptr_t
Definition nullptr_t.h:12
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
constexpr struct di::util::SwapFunction swap
constexpr auto destroy_at
Definition destroy_at.h:24
constexpr auto construct_at
Definition construct_at.h:27
constexpr auto as_fallible
Definition as_fallible.h:26
constexpr auto try_infallible
Definition try_infallible.h:31
Definition zstring_parser.h:9
constexpr auto allocate_one
Definition allocate_one.h:29
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
constexpr auto voidify
Definition voidify.h:13
constexpr auto deallocate_one
Definition deallocate_one.h:27
Definition function.h:239
constexpr auto down_cast() -> T *
Definition function.h:311
constexpr ErasedObject(ErasedObject &&other)
Definition function.h:284
ErasedObject(ErasedObject const &)=delete
constexpr auto down_cast() const -> T *
Definition function.h:323
constexpr void init_inline(Args &&... args)
Definition function.h:336
constexpr void reset()
Definition function.h:304
constexpr auto init_out_of_line(Args &&... args)
Definition function.h:346
constexpr ~ErasedObject()
Definition function.h:291
auto operator=(ErasedObject const &) -> ErasedObject &=delete
constexpr auto operator=(ErasedObject &&other) -> ErasedObject &
Definition function.h:294
constexpr auto empty() const -> bool
Definition function.h:303
Definition function.h:224
di::Array< di::Byte, 2 *sizeof(void *)> byte_storage
Definition function.h:227
auto address() -> void *
Definition function.h:230
auto address() const -> void const *
Definition function.h:231
void * pointer
Definition function.h:226
Definition function.h:569
R(Args...) Type
Definition function.h:210
T const CVQualified
Definition function.h:90
T RefQualified
Definition function.h:45
R(Args...) Type
Definition function.h:130
static constexpr bool is_invocable
Definition function.h:165
static constexpr bool is_invocable
Definition function.h:117
static constexpr bool is_invocable
Definition function.h:69
R(Args...) Type
Definition function.h:82
static constexpr bool is_invocable
Definition function.h:53
R(Args...) Type
Definition function.h:114
T const CVQualified
Definition function.h:186
T & RefQualified
Definition function.h:93
static constexpr bool is_invocable
Definition function.h:197
T && RefQualified
Definition function.h:205
static constexpr bool is_invocable
Definition function.h:37
T CVQualified
Definition function.h:138
T const CVQualified
Definition function.h:154
R(Args...) Type
Definition function.h:98
static constexpr bool is_noexcept
Definition function.h:215
T && RefQualified
Definition function.h:109
static constexpr bool is_noexcept
Definition function.h:87
static constexpr bool is_noexcept
Definition function.h:71
static constexpr bool is_invocable
Definition function.h:181
T CVQualified
Definition function.h:74
static constexpr bool is_noexcept
Definition function.h:135
T & RefQualified
Definition function.h:173
T & RefQualified
Definition function.h:77
T const CVQualified
Definition function.h:58
static constexpr bool is_noexcept
Definition function.h:199
R(Args...) Type
Definition function.h:146
static constexpr bool is_noexcept
Definition function.h:39
T const CVQualified
Definition function.h:218
R(Args...) Type
Definition function.h:162
static constexpr bool is_invocable
Definition function.h:213
T CVQualified
Definition function.h:202
static constexpr bool is_noexcept
Definition function.h:55
static constexpr bool is_noexcept
Definition function.h:167
static constexpr bool is_noexcept
Definition function.h:183
T RefQualified
Definition function.h:157
static constexpr bool is_invocable
Definition function.h:85
T CVQualified
Definition function.h:42
T CVQualified
Definition function.h:170
T & RefQualified
Definition function.h:189
T && RefQualified
Definition function.h:125
R(Args...) Type
Definition function.h:34
T RefQualified
Definition function.h:61
T CVQualified
Definition function.h:106
static constexpr bool is_noexcept
Definition function.h:103
R(Args...) Type
Definition function.h:178
T && RefQualified
Definition function.h:221
static constexpr bool is_noexcept
Definition function.h:151
static constexpr bool is_noexcept
Definition function.h:119
static constexpr bool is_invocable
Definition function.h:149
T const CVQualified
Definition function.h:122
static constexpr bool is_invocable
Definition function.h:133
R(Args...) Type
Definition function.h:66
static constexpr bool is_invocable
Definition function.h:101
R(Args...) Type
Definition function.h:194
R(Args...) Type
Definition function.h:50
T RefQualified
Definition function.h:141
Definition in_place_type.h:5
Definition span_fixed_size.h:37