23template<
typename Signature>
26template<
typename ReturnType,
typename... ParameterTypes>
27class TTask<ReturnType(ParameterTypes...)>
30 static constexpr size_t InlineDataSize = 16;
31 static constexpr size_t InlineDataAlignment = 8;
38 std::byte
Inline[InlineDataSize];
45 using CallFn = ReturnType(FPayload& Payload, ParameterTypes...);
46 using CopyFn =
void(FPayload& Dst,
const FPayload& Src);
47 using MoveFn =
void(FPayload& Dst, FPayload& Src);
48 using DestructFn =
void(FPayload& Payload);
50 CallFn* Call =
nullptr;
51 CopyFn*
Copy =
nullptr;
52 MoveFn*
Move =
nullptr;
53 DestructFn* Destruct =
nullptr;
62 static constexpr bool bCanUseInline =
sizeof(T) <= InlineDataSize &&
alignof(T) <= InlineDataAlignment;
65 static T* FunctionFrom(FPayload& Payload)
71 static const T* FunctionFrom(
const FPayload& Payload)
79 return (*FunctionFrom(Payload))(std::forward<ParameterTypes>(Arguments)...);
83 static void Copy(FPayload& Dst,
const FPayload& Src)
85 if constexpr (bCanUseInline)
87 new(Dst.Inline) T(*FunctionFrom(Src));
91 Dst.External =
new T(*FunctionFrom(Src));
96 static void Move(FPayload& Dst, FPayload& Src)
98 if constexpr (bCanUseInline)
100 new(Dst.Inline) T(std::move(*FunctionFrom(Src)));
104 Dst.External = Src.External;
109 static void Destruct(FPayload& Payload)
111 if constexpr (bCanUseInline)
113 FunctionFrom(Payload)->~T();
117 delete FunctionFrom(Payload);
140 PayloadMethods =
Other.PayloadMethods;
141 PayloadMethods->Copy(Payload,
Other.Payload);
150 PayloadMethods =
Other.PayloadMethods;
151 PayloadMethods->Move(Payload,
Other.Payload);
152 Other.PayloadMethods =
nullptr;
159 typename FunctorType,
160 typename = std::enable_if_t
163 !std::is_same_v<std::decay_t<FunctorType>,
TTask> &&
165 std::is_invocable_r_v<ReturnType, std::decay_t<FunctorType>, ParameterTypes...>
170 using Decayed = std::decay_t<FunctorType>;
172 PayloadMethods = &Traits::PayloadMethods;
173 if (Traits::bCanUseInline)
175 new(Payload.Inline)
Decayed(std::forward<FunctorType>(
Other));
179 Payload.External =
new Decayed(std::forward<FunctorType>(
Other));
191 PayloadMethods =
Other.PayloadMethods;
192 PayloadMethods->Copy(Payload,
Other.Payload);
206 PayloadMethods =
Other.PayloadMethods;
207 PayloadMethods->Move(Payload,
Other.Payload);
208 Other.PayloadMethods =
nullptr;
218 return PayloadMethods->Call(Payload, std::forward<ArgumentTypes>(Arguments)...);
226 PayloadMethods->Destruct(Payload);
227 PayloadMethods =
nullptr;
234 return PayloadMethods !=
nullptr;
240 return reinterpret_cast<void*
>(PayloadMethods->Call);
245 alignas(InlineDataAlignment)
mutable FPayload Payload;
250static_assert(
sizeof(TTask<
void()>) <= 24);
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define AUTORTFM_DISABLE
Definition AutoRTFMDefines.h:116
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Move(T &A, typename TMoveSupportTraits< T >::Copy B)
Definition UnrealTemplate.h:24
bool IsSet() const
Definition AutoRTFMTask.h:232
void Reset()
Definition AutoRTFMTask.h:222
TTask(TTask &&Other)
Definition AutoRTFMTask.h:146
TTask(const TTask &Other)
Definition AutoRTFMTask.h:136
~TTask()
Definition AutoRTFMTask.h:130
AUTORTFM_DISABLE ReturnType operator()(ArgumentTypes &&... Arguments) const
Definition AutoRTFMTask.h:216
TTask(FunctorType &&Other)
Definition AutoRTFMTask.h:168
void * FunctionAddress() const
Definition AutoRTFMTask.h:238
Definition AutoRTFMTask.h:24
void Destruct(void *Dest)
Definition Class.h:1265