Simplify Variant code with define for ManagedObject handle
This commit is contained in:
@@ -28,6 +28,12 @@
|
||||
#include "Engine/Utilities/Crc.h"
|
||||
#include "Engine/Utilities/StringConverter.h"
|
||||
|
||||
#if USE_NETCORE
|
||||
#define MANAGED_GC_HANDLE AsUint64
|
||||
#else
|
||||
#define MANAGED_GC_HANDLE AsUint
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
const char* InBuiltTypesTypeNames[40] =
|
||||
@@ -498,13 +504,8 @@ Variant::Variant(Variant&& other) noexcept
|
||||
other.AsDictionary = nullptr;
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
AsUint64 = other.AsUint64;
|
||||
other.AsUint64 = 0;
|
||||
#elif USE_MONO
|
||||
AsUint = other.AsUint;
|
||||
other.AsUint = 0;
|
||||
#endif
|
||||
MANAGED_GC_HANDLE = other.MANAGED_GC_HANDLE;
|
||||
other.MANAGED_GC_HANDLE = 0;
|
||||
break;
|
||||
case VariantType::Null:
|
||||
case VariantType::Void:
|
||||
@@ -625,11 +626,7 @@ Variant::Variant(Asset* v)
|
||||
Variant::Variant(MObject* v)
|
||||
: Type(VariantType::ManagedObject, v ? MCore::Object::GetClass(v) : nullptr)
|
||||
{
|
||||
#if USE_NETCORE
|
||||
AsUint64 = v ? MCore::GCHandle::New(v) : 0;
|
||||
#else
|
||||
AsUint = v ? MCore::GCHandle::New(v) : 0;
|
||||
#endif
|
||||
MANAGED_GC_HANDLE = v ? MCore::GCHandle::New(v) : 0;
|
||||
}
|
||||
|
||||
#else
|
||||
@@ -968,13 +965,8 @@ Variant::~Variant()
|
||||
Delete(AsDictionary);
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
if (AsUint64)
|
||||
MCore::GCHandle::Free(AsUint64);
|
||||
#elif USE_MONO
|
||||
if (AsUint)
|
||||
MCore::GCHandle::Free(AsUint);
|
||||
#endif
|
||||
if (MANAGED_GC_HANDLE)
|
||||
MCore::GCHandle::Free(MANAGED_GC_HANDLE);
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
@@ -1027,13 +1019,8 @@ Variant& Variant::operator=(Variant&& other)
|
||||
other.AsDictionary = nullptr;
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
AsUint64 = other.AsUint64;
|
||||
other.AsUint64 = 0;
|
||||
#elif USE_MONO
|
||||
AsUint = other.AsUint;
|
||||
other.AsUint = 0;
|
||||
#endif
|
||||
MANAGED_GC_HANDLE = other.MANAGED_GC_HANDLE;
|
||||
other.MANAGED_GC_HANDLE = 0;
|
||||
break;
|
||||
case VariantType::Null:
|
||||
case VariantType::Void:
|
||||
@@ -1105,11 +1092,7 @@ Variant& Variant::operator=(const Variant& other)
|
||||
AsDictionary = New<Dictionary<Variant, Variant>>(*other.AsDictionary);
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
AsUint64 = other.AsUint64 ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.AsUint64)) : 0;
|
||||
#elif USE_MONO
|
||||
AsUint = other.AsUint ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.AsUint)) : 0;
|
||||
#endif
|
||||
MANAGED_GC_HANDLE = other.MANAGED_GC_HANDLE ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.MANAGED_GC_HANDLE)) : 0;
|
||||
break;
|
||||
case VariantType::Null:
|
||||
case VariantType::Void:
|
||||
@@ -1234,11 +1217,9 @@ bool Variant::operator==(const Variant& other) const
|
||||
return false;
|
||||
return AsBlob.Length == other.AsBlob.Length && StringUtils::Compare(static_cast<const char*>(AsBlob.Data), static_cast<const char*>(other.AsBlob.Data), AsBlob.Length - 1) == 0;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
#if USE_CSHARP
|
||||
// TODO: invoke C# Equality logic?
|
||||
return AsUint64 == other.AsUint64 || MCore::GCHandle::GetTarget(AsUint64) == MCore::GCHandle::GetTarget(other.AsUint64);
|
||||
#elif USE_MONO
|
||||
return AsUint == other.AsUint || MCore::GCHandle::GetTarget(AsUint) == MCore::GCHandle::GetTarget(other.AsUint);
|
||||
return MANAGED_GC_HANDLE == other.MANAGED_GC_HANDLE || MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) == MCore::GCHandle::GetTarget(other.MANAGED_GC_HANDLE);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
@@ -1331,10 +1312,8 @@ Variant::operator bool() const
|
||||
case VariantType::Asset:
|
||||
return AsAsset != nullptr;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
return AsUint64 != 0 && MCore::GCHandle::GetTarget(AsUint64) != nullptr;
|
||||
#elif USE_MONO
|
||||
return AsUint != 0 && MCore::GCHandle::GetTarget(AsUint) != nullptr;
|
||||
#if USE_CSHARP
|
||||
return MANAGED_GC_HANDLE != 0 && MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) != nullptr;
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
@@ -1605,10 +1584,8 @@ Variant::operator void*() const
|
||||
case VariantType::Blob:
|
||||
return AsBlob.Data;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
return AsUint64 ? MCore::GCHandle::GetTarget(AsUint64) : nullptr;
|
||||
#elif USE_MONO
|
||||
return AsUint ? MCore::GCHandle::GetTarget(AsUint) : nullptr;
|
||||
#if USE_CSHARP
|
||||
return MANAGED_GC_HANDLE ? MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) : nullptr;
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
@@ -1654,10 +1631,8 @@ Variant::operator ScriptingObject*() const
|
||||
|
||||
Variant::operator MObject*() const
|
||||
{
|
||||
#if USE_NETCORE
|
||||
return Type.Type == VariantType::ManagedObject && AsUint64 ? MCore::GCHandle::GetTarget(AsUint64) : nullptr;
|
||||
#elif USE_MONO
|
||||
return Type.Type == VariantType::ManagedObject && AsUint ? MCore::GCHandle::GetTarget(AsUint) : nullptr;
|
||||
#if USE_CSHARP
|
||||
return Type.Type == VariantType::ManagedObject && MANAGED_GC_HANDLE ? MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE) : nullptr;
|
||||
#else
|
||||
return nullptr;
|
||||
#endif
|
||||
@@ -2370,12 +2345,9 @@ void Variant::SetType(const VariantType& type)
|
||||
Delete(AsDictionary);
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
if (AsUint64)
|
||||
MCore::GCHandle::Free(AsUint64);
|
||||
#elif USE_MONO
|
||||
if (AsUint)
|
||||
MCore::GCHandle::Free(AsUint);
|
||||
#if USE_CSHARP
|
||||
if (MANAGED_GC_HANDLE)
|
||||
MCore::GCHandle::Free(MANAGED_GC_HANDLE);
|
||||
#endif
|
||||
break;
|
||||
default: ;
|
||||
@@ -2430,10 +2402,8 @@ void Variant::SetType(const VariantType& type)
|
||||
AsDictionary = New<Dictionary<Variant, Variant>>();
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
AsUint64 = 0;
|
||||
#elif USE_MONO
|
||||
AsUint = 0;
|
||||
#if USE_CSHARP
|
||||
MANAGED_GC_HANDLE = 0;
|
||||
#endif
|
||||
break;
|
||||
case VariantType::Structure:
|
||||
@@ -2487,12 +2457,9 @@ void Variant::SetType(VariantType&& type)
|
||||
Delete(AsDictionary);
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
if (AsUint64)
|
||||
MCore::GCHandle::Free(AsUint64);
|
||||
#elif USE_MONO
|
||||
if (AsUint)
|
||||
MCore::GCHandle::Free(AsUint);
|
||||
#if USE_CSHARP
|
||||
if (MANAGED_GC_HANDLE)
|
||||
MCore::GCHandle::Free(MANAGED_GC_HANDLE);
|
||||
#endif
|
||||
break;
|
||||
default: ;
|
||||
@@ -2547,10 +2514,8 @@ void Variant::SetType(VariantType&& type)
|
||||
AsDictionary = New<Dictionary<Variant, Variant>>();
|
||||
break;
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
AsUint64 = 0;
|
||||
#elif USE_MONO
|
||||
AsUint = 0;
|
||||
#if USE_CSHARP
|
||||
MANAGED_GC_HANDLE = 0;
|
||||
#endif
|
||||
break;
|
||||
case VariantType::Structure:
|
||||
@@ -2680,21 +2645,13 @@ void Variant::SetManagedObject(MObject* object)
|
||||
{
|
||||
if (Type.Type != VariantType::ManagedObject)
|
||||
SetType(VariantType(VariantType::ManagedObject, MCore::Object::GetClass(object)));
|
||||
#if USE_NETCORE
|
||||
AsUint64 = MCore::GCHandle::New(object);
|
||||
#else
|
||||
AsUint = MCore::GCHandle::New(object);
|
||||
#endif
|
||||
MANAGED_GC_HANDLE = MCore::GCHandle::New(object);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Type.Type != VariantType::ManagedObject || Type.TypeName)
|
||||
SetType(VariantType(VariantType::ManagedObject));
|
||||
#if USE_NETCORE
|
||||
AsUint64 = 0;
|
||||
#elif USE_MONO
|
||||
AsUint = 0;
|
||||
#endif
|
||||
MANAGED_GC_HANDLE = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -2807,10 +2764,8 @@ String Variant::ToString() const
|
||||
case VariantType::Typename:
|
||||
return String((const char*)AsBlob.Data, AsBlob.Length ? AsBlob.Length - 1 : 0);
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
return AsUint64 ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(AsUint64)))) : TEXT("null");
|
||||
#elif USE_MONO
|
||||
return AsUint ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(AsUint)))) : TEXT("null");
|
||||
#if USE_CSHARP
|
||||
return MANAGED_GC_HANDLE ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(MANAGED_GC_HANDLE)))) : TEXT("null");
|
||||
#else
|
||||
return String::Empty;
|
||||
#endif
|
||||
@@ -2981,11 +2936,7 @@ Variant Variant::NewValue(const StringAnsiView& typeName)
|
||||
MObject* instance = mclass->CreateInstance();
|
||||
if (instance)
|
||||
{
|
||||
#if USE_NETCORE
|
||||
v.AsUint64 = MCore::GCHandle::New(instance);
|
||||
#else
|
||||
v.AsUint = MCore::GCHandle::New(instance);
|
||||
#endif
|
||||
v.MANAGED_GC_HANDLE = MCore::GCHandle::New(instance);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3930,12 +3881,7 @@ void Variant::AllocStructure()
|
||||
Platform::MemoryCopy(AsBlob.Data, data, AsBlob.Length);
|
||||
#else
|
||||
Type.Type = VariantType::ManagedObject;
|
||||
|
||||
#if USE_NETCORE
|
||||
AsUint64 = MCore::GCHandle::New(instance);
|
||||
#else
|
||||
AsUint = MCore::GCHandle::New(instance);
|
||||
#endif
|
||||
MANAGED_GC_HANDLE = MCore::GCHandle::New(instance);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
@@ -4027,10 +3973,8 @@ uint32 GetHash(const Variant& key)
|
||||
case VariantType::Typename:
|
||||
return GetHash((const char*)key.AsBlob.Data);
|
||||
case VariantType::ManagedObject:
|
||||
#if USE_NETCORE
|
||||
return key.AsUint64 ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.AsUint64)) : 0;
|
||||
#elif USE_MONO
|
||||
return key.AsUint ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.AsUint)) : 0;
|
||||
#if USE_CSHARP
|
||||
return key.MANAGED_GC_HANDLE ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.MANAGED_GC_HANDLE)) : 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user