Fix Variant enum casting

This commit is contained in:
Wojtek Figat
2024-11-22 16:04:34 +01:00
parent 74993dcf9e
commit 914d82a087

View File

@@ -33,6 +33,7 @@
#else
#define MANAGED_GC_HANDLE AsUint
#endif
#define AsEnum AsUint64
namespace
{
@@ -1155,8 +1156,9 @@ bool Variant::operator==(const Variant& other) const
case VariantType::Int64:
return AsInt64 == other.AsInt64;
case VariantType::Uint64:
case VariantType::Enum:
return AsUint64 == other.AsUint64;
case VariantType::Enum:
return AsEnum == other.AsEnum;
case VariantType::Float:
return Math::NearEqual(AsFloat, other.AsFloat);
case VariantType::Double:
@@ -1285,8 +1287,9 @@ bool Variant::operator<(const Variant& other) const
case VariantType::Int64:
return AsInt64 < other.AsInt64;
case VariantType::Uint64:
case VariantType::Enum:
return AsUint64 < other.AsUint64;
case VariantType::Enum:
return AsEnum < other.AsEnum;
case VariantType::Float:
return AsFloat < other.AsFloat;
case VariantType::Double:
@@ -3009,7 +3012,7 @@ Variant Variant::NewValue(const StringAnsiView& typeName)
break;
case ScriptingTypes::Enum:
v.SetType(VariantType(VariantType::Enum, typeName));
v.AsUint64 = 0;
v.AsEnum = 0;
break;
default:
LOG(Error, "Unsupported scripting type '{}' for Variant", typeName.ToString());
@@ -3023,7 +3026,7 @@ Variant Variant::NewValue(const StringAnsiView& typeName)
if (mclass->IsEnum())
{
v.SetType(VariantType(VariantType::Enum, typeName));
v.AsUint64 = 0;
v.AsEnum = 0;
}
else if (mclass->IsValueType())
{
@@ -3097,8 +3100,10 @@ Variant Variant::Parse(const StringView& text, const VariantType& type)
StringUtils::Parse(text.Get(), text.Length(), &result.AsInt64);
break;
case VariantType::Uint64:
StringUtils::Parse(text.Get(), text.Length(), &result.AsInt64);
break;
case VariantType::Enum:
if (!StringUtils::Parse(text.Get(), text.Length(), &result.AsUint64))
if (!StringUtils::Parse(text.Get(), text.Length(), &result.AsEnum))
{
}
else if (type.TypeName)
@@ -3113,7 +3118,7 @@ Variant Variant::Parse(const StringView& text, const VariantType& type)
{
if (textAnsiView == items[i].Name)
{
result.AsUint64 = items[i].Value;
result.AsEnum = items[i].Value;
break;
}
}
@@ -3491,8 +3496,8 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
return Variant(Double3(v.AsBool ? 1.0 : 0.0));
case VariantType::Double4:
return Variant(Double4(v.AsBool ? 1.0 : 0.0));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
case VariantType::Enum:
return Enum(to, v.AsBool ? 1 : 0);
default: ;
}
break;
@@ -3530,7 +3535,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Double4:
return Variant(Double4((double)v.AsInt16));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsInt16);
default: ;
}
break;
@@ -3562,7 +3567,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Color:
return Variant(Color((float)v.AsInt));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsInt);
default: ;
}
break;
@@ -3600,7 +3605,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Double4:
return Variant(Double4((double)v.AsUint16));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsUint16);
default: ;
}
break;
@@ -3638,7 +3643,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Double4:
return Variant(Double4((double)v.AsUint));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsUint);
default: ;
}
break;
@@ -3676,7 +3681,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Double4:
return Variant(Double4((double)v.AsInt64));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsInt64);
default: ;
}
break;
@@ -3714,7 +3719,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Double4:
return Variant(Double4((double)v.AsInt));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsInt);
default: ;
}
break;
@@ -3752,7 +3757,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Double4:
return Variant(Double4(v.AsFloat));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsFloat);
default: ;
}
break;
@@ -3790,7 +3795,7 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
case VariantType::Double4:
return Variant(Double4(v.AsDouble));
case VariantType::Enum:
return Enum(to, (int64)v.AsBool);
return Enum(to, (int64)v.AsDouble);
default: ;
}
break;
@@ -3938,6 +3943,25 @@ Variant Variant::Cast(const Variant& v, const VariantType& to)
default: ;
}
break;
case VariantType::Enum:
switch (to.Type)
{
case VariantType::Bool:
return Variant(v.AsEnum != 0);
case VariantType::Int:
return Variant((int32)v.AsEnum);
case VariantType::Uint:
return Variant((uint32)v.AsEnum);
case VariantType::Int64:
return Variant((int64)v.AsEnum);
case VariantType::Uint64:
return Variant((uint64)v.AsEnum);
case VariantType::Float:
return Variant((float)v.AsEnum);
case VariantType::Double:
return Variant((double)v.AsEnum);
}
break;
default: ;
}
LOG(Error, "Cannot cast Variant from {0} to {1}", v.Type, to);
@@ -4162,7 +4186,7 @@ Variant Variant::Enum(const VariantType& type, const uint64 value)
{
Variant v;
v.SetType(type);
v.AsUint64 = value;
v.AsEnum = value;
return MoveTemp(v);
}
@@ -4183,8 +4207,9 @@ uint32 GetHash(const Variant& key)
case VariantType::Int64:
return GetHash(key.AsInt64);
case VariantType::Uint64:
case VariantType::Enum:
return GetHash(key.AsUint64);
case VariantType::Enum:
return GetHash(key.AsEnum);
case VariantType::Float:
return GetHash(key.AsFloat);
case VariantType::Double: