feat(templates): add CAnyCustomStorage for TAny
This commit is contained in:
parent
9ff3b1c583
commit
226f5a34e9
@ -15,7 +15,26 @@ NAMESPACE_MODULE_BEGIN(Utility)
|
|||||||
|
|
||||||
// TAny's CustomStorage concept, see FAnyDefaultStorage.
|
// TAny's CustomStorage concept, see FAnyDefaultStorage.
|
||||||
template <typename T>
|
template <typename T>
|
||||||
concept CAnyStorage = true; // TODO
|
concept CAnyCustomStorage =
|
||||||
|
// CSameAs<decltype(T::InlineSize), const size_t> &&
|
||||||
|
// CSameAs<decltype(T::InlineAlignment), const size_t> &&
|
||||||
|
requires(const T& A)
|
||||||
|
{
|
||||||
|
{ A.InlineAllocation() } -> CSameAs<const void*>;
|
||||||
|
{ A.HeapAllocation() } -> CSameAs<void*>;
|
||||||
|
{ A.TypeInfo() } -> CSameAs<uintptr>;
|
||||||
|
} &&
|
||||||
|
requires(T& A)
|
||||||
|
{
|
||||||
|
{ A.InlineAllocation() } -> CSameAs<void*>;
|
||||||
|
{ A.HeapAllocation() } -> CSameAs<void*&>;
|
||||||
|
{ A.TypeInfo() } -> CSameAs<uintptr&>;
|
||||||
|
} &&
|
||||||
|
requires(T& A, const T& B, T&& C)
|
||||||
|
{
|
||||||
|
A.CopyCustom(B);
|
||||||
|
A.MoveCustom(MoveTemp(C));
|
||||||
|
};
|
||||||
|
|
||||||
// TAny's default storage structure.
|
// TAny's default storage structure.
|
||||||
struct alignas(16) FAnyDefaultStorage
|
struct alignas(16) FAnyDefaultStorage
|
||||||
@ -25,7 +44,7 @@ struct alignas(16) FAnyDefaultStorage
|
|||||||
// You can add custom variables like this.
|
// You can add custom variables like this.
|
||||||
//Type Variable;
|
//Type Variable;
|
||||||
|
|
||||||
//~ Begin CAnyStorage Interface
|
//~ Begin CAnyCustomStorage Interface
|
||||||
inline static constexpr size_t InlineSize = 64 - sizeof(uintptr);
|
inline static constexpr size_t InlineSize = 64 - sizeof(uintptr);
|
||||||
inline static constexpr size_t InlineAlignment = 16;
|
inline static constexpr size_t InlineAlignment = 16;
|
||||||
constexpr void* InlineAllocation() { return &InlineAllocationImpl; }
|
constexpr void* InlineAllocation() { return &InlineAllocationImpl; }
|
||||||
@ -36,7 +55,7 @@ struct alignas(16) FAnyDefaultStorage
|
|||||||
constexpr uintptr TypeInfo() const { return TypeInfoImpl; }
|
constexpr uintptr TypeInfo() const { return TypeInfoImpl; }
|
||||||
constexpr void CopyCustom(const FAnyDefaultStorage& InValue) { /* Variable = InValue.Variable; */ } // You just need to copy the custom variables.
|
constexpr void CopyCustom(const FAnyDefaultStorage& InValue) { /* Variable = InValue.Variable; */ } // You just need to copy the custom variables.
|
||||||
constexpr void MoveCustom( FAnyDefaultStorage&& InValue) { /* Variable = MoveTemp(InValue.Variable); */ } // You just need to move the custom variables.
|
constexpr void MoveCustom( FAnyDefaultStorage&& InValue) { /* Variable = MoveTemp(InValue.Variable); */ } // You just need to move the custom variables.
|
||||||
//~ End CAnyStorage Interface
|
//~ End CAnyCustomStorage Interface
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
@ -48,11 +67,11 @@ struct alignas(16) FAnyDefaultStorage
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static_assert(CAnyStorage<FAnyDefaultStorage>);
|
static_assert(CAnyCustomStorage<FAnyDefaultStorage>);
|
||||||
|
|
||||||
// You can add custom storage area through CustomStorage, such as TFunction.
|
// You can add custom storage area through CustomStorage, such as TFunction.
|
||||||
// It is not recommended to use this, FAny is recommended.
|
// It is not recommended to use this, FAny is recommended.
|
||||||
template <CAnyStorage CustomStorage = FAnyDefaultStorage>
|
template <CAnyCustomStorage CustomStorage = FAnyDefaultStorage>
|
||||||
struct TAny
|
struct TAny
|
||||||
{
|
{
|
||||||
inline static constexpr size_t InlineSize = CustomStorage::InlineSize;
|
inline static constexpr size_t InlineSize = CustomStorage::InlineSize;
|
||||||
@ -460,13 +479,13 @@ private:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T, CAnyStorage StorageType>
|
template <typename T, CAnyCustomStorage StorageType>
|
||||||
constexpr bool operator==(const TAny<StorageType>& LHS, const T& RHS)
|
constexpr bool operator==(const TAny<StorageType>& LHS, const T& RHS)
|
||||||
{
|
{
|
||||||
return LHS.template HoldsAlternative<T>() ? LHS.template GetValue<T>() == RHS : false;
|
return LHS.template HoldsAlternative<T>() ? LHS.template GetValue<T>() == RHS : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <CAnyStorage StorageType>
|
template <CAnyCustomStorage StorageType>
|
||||||
constexpr bool operator==(const TAny<StorageType>& LHS, FInvalid)
|
constexpr bool operator==(const TAny<StorageType>& LHS, FInvalid)
|
||||||
{
|
{
|
||||||
return !LHS.IsValid();
|
return !LHS.IsValid();
|
||||||
@ -474,8 +493,8 @@ constexpr bool operator==(const TAny<StorageType>& LHS, FInvalid)
|
|||||||
|
|
||||||
NAMESPACE_PRIVATE_BEGIN
|
NAMESPACE_PRIVATE_BEGIN
|
||||||
|
|
||||||
template <typename T> struct TIsTAny : FFalse { };
|
template <typename T> struct TIsTAny : FFalse { };
|
||||||
template <CAnyStorage StorageType> struct TIsTAny<TAny<StorageType>> : FTrue { };
|
template <CAnyCustomStorage StorageType> struct TIsTAny<TAny<StorageType>> : FTrue { };
|
||||||
|
|
||||||
NAMESPACE_PRIVATE_END
|
NAMESPACE_PRIVATE_END
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ template <typename Ret, typename... Types> struct TFunctionInfo<Ret(Types...) co
|
|||||||
template <typename CallableType>
|
template <typename CallableType>
|
||||||
struct alignas(16) FFunctionStorage
|
struct alignas(16) FFunctionStorage
|
||||||
{
|
{
|
||||||
//~ Begin CAnyStorage Interface
|
//~ Begin CAnyCustomStorage Interface
|
||||||
inline static constexpr size_t InlineSize = 64 - sizeof(uintptr) - sizeof(CallableType);
|
inline static constexpr size_t InlineSize = 64 - sizeof(uintptr) - sizeof(CallableType);
|
||||||
inline static constexpr size_t InlineAlignment = 16;
|
inline static constexpr size_t InlineAlignment = 16;
|
||||||
constexpr void* InlineAllocation() { return &InlineAllocationImpl; }
|
constexpr void* InlineAllocation() { return &InlineAllocationImpl; }
|
||||||
@ -94,7 +94,7 @@ struct alignas(16) FFunctionStorage
|
|||||||
constexpr uintptr TypeInfo() const { return TypeInfoImpl; }
|
constexpr uintptr TypeInfo() const { return TypeInfoImpl; }
|
||||||
constexpr void CopyCustom(const FFunctionStorage& InValue) { Callable = InValue.Callable; }
|
constexpr void CopyCustom(const FFunctionStorage& InValue) { Callable = InValue.Callable; }
|
||||||
constexpr void MoveCustom( FFunctionStorage&& InValue) { Callable = InValue.Callable; }
|
constexpr void MoveCustom( FFunctionStorage&& InValue) { Callable = InValue.Callable; }
|
||||||
//~ End CAnyStorage Interface
|
//~ End CAnyCustomStorage Interface
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
@ -106,9 +106,6 @@ struct alignas(16) FFunctionStorage
|
|||||||
|
|
||||||
CallableType Callable;
|
CallableType Callable;
|
||||||
|
|
||||||
template <CAnyStorage T>
|
|
||||||
friend struct TAny;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename F, typename CVRef, bool bIsRef> struct TFunctionImpl;
|
template <typename F, typename CVRef, bool bIsRef> struct TFunctionImpl;
|
||||||
|
Loading…
Reference in New Issue
Block a user