Fix Variant enum casting
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user