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