Add basic Variant parsing from text
This commit is contained in:
@@ -35,7 +35,7 @@ StringView StringView::Left(int32 count) const
|
|||||||
StringView StringView::Right(int32 count) const
|
StringView StringView::Right(int32 count) const
|
||||||
{
|
{
|
||||||
const int32 countClamped = count < 0 ? 0 : count < Length() ? count : Length();
|
const int32 countClamped = count < 0 ? 0 : count < Length() ? count : Length();
|
||||||
return StringView(**this + Length() - countClamped);
|
return StringView(**this + countClamped, Length() - countClamped);
|
||||||
}
|
}
|
||||||
|
|
||||||
StringView StringView::Substring(int32 startIndex) const
|
StringView StringView::Substring(int32 startIndex) const
|
||||||
|
|||||||
@@ -2449,7 +2449,9 @@ void Variant::SetType(const VariantType& type)
|
|||||||
case VariantType::Structure:
|
case VariantType::Structure:
|
||||||
AllocStructure();
|
AllocStructure();
|
||||||
break;
|
break;
|
||||||
default: ;
|
default:
|
||||||
|
AsUint64 = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3065,6 +3067,69 @@ void Variant::DeleteValue()
|
|||||||
SetType(VariantType(VariantType::Null));
|
SetType(VariantType(VariantType::Null));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Variant Variant::Parse(const StringView& text, const VariantType& type)
|
||||||
|
{
|
||||||
|
Variant result;
|
||||||
|
result.SetType(type);
|
||||||
|
if (text.IsEmpty())
|
||||||
|
return result;
|
||||||
|
if (type != VariantType())
|
||||||
|
{
|
||||||
|
switch (type.Type)
|
||||||
|
{
|
||||||
|
case VariantType::Bool:
|
||||||
|
if (text == TEXT("1") || text.Compare(StringView(TEXT("true"), 4), StringSearchCase::IgnoreCase) == 0)
|
||||||
|
result.AsBool = true;
|
||||||
|
break;
|
||||||
|
case VariantType::Int16:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsInt16);
|
||||||
|
break;
|
||||||
|
case VariantType::Uint16:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsUint16);
|
||||||
|
break;
|
||||||
|
case VariantType::Int:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsInt);
|
||||||
|
break;
|
||||||
|
case VariantType::Uint:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsUint);
|
||||||
|
break;
|
||||||
|
case VariantType::Int64:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsInt64);
|
||||||
|
break;
|
||||||
|
case VariantType::Uint64:
|
||||||
|
case VariantType::Enum:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsUint64);
|
||||||
|
break;
|
||||||
|
case VariantType::Float:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsFloat);
|
||||||
|
break;
|
||||||
|
case VariantType::Double:
|
||||||
|
StringUtils::Parse(text.Get(), &result.AsFloat);
|
||||||
|
result.AsDouble = (float)result.AsFloat;
|
||||||
|
break;
|
||||||
|
case VariantType::String:
|
||||||
|
result.SetString(text);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Parse as number
|
||||||
|
int32 valueInt;
|
||||||
|
if (!StringUtils::Parse(text.Get(), text.Length(), &valueInt))
|
||||||
|
{
|
||||||
|
result = valueInt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Fallback to string
|
||||||
|
result.SetString(text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
bool Variant::CanCast(const Variant& v, const VariantType& to)
|
bool Variant::CanCast(const Variant& v, const VariantType& to)
|
||||||
{
|
{
|
||||||
if (v.Type == to)
|
if (v.Type == to)
|
||||||
|
|||||||
@@ -381,6 +381,9 @@ public:
|
|||||||
// Frees the object or data owned by this Variant container (eg. structure or object).
|
// Frees the object or data owned by this Variant container (eg. structure or object).
|
||||||
void DeleteValue();
|
void DeleteValue();
|
||||||
|
|
||||||
|
// Parses the text into the Variant value. Allows to specify explicit value type.
|
||||||
|
static Variant Parse(const StringView& text, const VariantType& type = VariantType());
|
||||||
|
|
||||||
FORCE_INLINE Variant Cast(const VariantType& to) const
|
FORCE_INLINE Variant Cast(const VariantType& to) const
|
||||||
{
|
{
|
||||||
return Cast(*this, to);
|
return Cast(*this, to);
|
||||||
|
|||||||
Reference in New Issue
Block a user