1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:17:35 +00:00

LibGUI: Add 64-bit signed integer support to GVariant

What was previously the "Int" type is now "Int32" and "Int64".
This commit is contained in:
Andreas Kling 2020-01-27 10:55:10 +01:00
parent 137a45dff2
commit 6906edee9a
8 changed files with 120 additions and 64 deletions

View file

@ -30,19 +30,34 @@
const char* to_string(GVariant::Type type)
{
switch (type) {
case GVariant::Type::Invalid: return "Invalid";
case GVariant::Type::Bool: return "Bool";
case GVariant::Type::Int: return "Int";
case GVariant::Type::UnsignedInt: return "UnsignedInt";
case GVariant::Type::Float: return "Float";
case GVariant::Type::String: return "String";
case GVariant::Type::Bitmap: return "Bitmap";
case GVariant::Type::Color: return "Color";
case GVariant::Type::Icon: return "Icon";
case GVariant::Type::Point: return "Point";
case GVariant::Type::Size: return "Size";
case GVariant::Type::Rect: return "Rect";
case GVariant::Type::Font: return "Font";
case GVariant::Type::Invalid:
return "Invalid";
case GVariant::Type::Bool:
return "Bool";
case GVariant::Type::Int32:
return "Int32";
case GVariant::Type::Int64:
return "Int64";
case GVariant::Type::UnsignedInt:
return "UnsignedInt";
case GVariant::Type::Float:
return "Float";
case GVariant::Type::String:
return "String";
case GVariant::Type::Bitmap:
return "Bitmap";
case GVariant::Type::Color:
return "Color";
case GVariant::Type::Icon:
return "Icon";
case GVariant::Type::Point:
return "Point";
case GVariant::Type::Size:
return "Size";
case GVariant::Type::Rect:
return "Rect";
case GVariant::Type::Font:
return "Font";
}
ASSERT_NOT_REACHED();
}
@ -76,10 +91,16 @@ void GVariant::clear()
m_value.as_string = nullptr;
}
GVariant::GVariant(int value)
: m_type(Type::Int)
GVariant::GVariant(i32 value)
: m_type(Type::Int32)
{
m_value.as_int = value;
m_value.as_i32 = value;
}
GVariant::GVariant(i64 value)
: m_type(Type::Int64)
{
m_value.as_i64 = value;
}
GVariant::GVariant(unsigned value)
@ -120,8 +141,8 @@ GVariant::GVariant(const JsonValue& value)
}
if (value.is_i32()) {
m_type = Type::Int;
m_value.as_int = value.as_i32();
m_type = Type::Int32;
m_value.as_i32 = value.as_i32();
return;
}
@ -132,9 +153,8 @@ GVariant::GVariant(const JsonValue& value)
}
if (value.is_i64()) {
// FIXME: GVariant should have a 64-bit internal type.
m_type = Type::Int;
m_value.as_int = value.to_i32();
m_type = Type::Int64;
m_value.as_i64 = value.as_i64();
return;
}
@ -239,8 +259,11 @@ void GVariant::copy_from(const GVariant& other)
case Type::Bool:
m_value.as_bool = other.m_value.as_bool;
break;
case Type::Int:
m_value.as_int = other.m_value.as_int;
case Type::Int32:
m_value.as_i32 = other.m_value.as_i32;
break;
case Type::Int64:
m_value.as_i64 = other.m_value.as_i64;
break;
case Type::UnsignedInt:
m_value.as_uint = other.m_value.as_uint;
@ -288,8 +311,10 @@ bool GVariant::operator==(const GVariant& other) const
switch (m_type) {
case Type::Bool:
return as_bool() == other.as_bool();
case Type::Int:
return as_int() == other.as_int();
case Type::Int32:
return as_i32() == other.as_i32();
case Type::Int64:
return as_i64() == other.as_i64();
case Type::UnsignedInt:
return as_uint() == other.as_uint();
case Type::Float:
@ -323,8 +348,10 @@ bool GVariant::operator<(const GVariant& other) const
switch (m_type) {
case Type::Bool:
return as_bool() < other.as_bool();
case Type::Int:
return as_int() < other.as_int();
case Type::Int32:
return as_i32() < other.as_i32();
case Type::Int64:
return as_i64() < other.as_i64();
case Type::UnsignedInt:
return as_uint() < other.as_uint();
case Type::Float:
@ -356,8 +383,10 @@ String GVariant::to_string() const
switch (m_type) {
case Type::Bool:
return as_bool() ? "true" : "false";
case Type::Int:
return String::number(as_int());
case Type::Int32:
return String::number(as_i32());
case Type::Int64:
return String::number(as_i64());
case Type::UnsignedInt:
return String::number(as_uint());
case Type::Float:

View file

@ -40,7 +40,8 @@ public:
GVariant();
GVariant(bool);
GVariant(float);
GVariant(int);
GVariant(i32);
GVariant(i64);
GVariant(unsigned);
GVariant(const char*);
GVariant(const String&);
@ -65,7 +66,8 @@ public:
enum class Type {
Invalid,
Bool,
Int,
Int32,
Int64,
UnsignedInt,
Float,
String,
@ -80,7 +82,8 @@ public:
bool is_valid() const { return m_type != Type::Invalid; }
bool is_bool() const { return m_type == Type::Bool; }
bool is_int() const { return m_type == Type::Int; }
bool is_i32() const { return m_type == Type::Int32; }
bool is_i64() const { return m_type == Type::Int64; }
bool is_uint() const { return m_type == Type::UnsignedInt; }
bool is_float() const { return m_type == Type::Float; }
bool is_string() const { return m_type == Type::String; }
@ -105,8 +108,10 @@ public:
return as_bool();
if (type() == Type::String)
return !!m_value.as_string;
if (type() == Type::Int)
return m_value.as_int != 0;
if (type() == Type::Int32)
return m_value.as_i32 != 0;
if (type() == Type::Int64)
return m_value.as_i64 != 0;
if (type() == Type::UnsignedInt)
return m_value.as_uint != 0;
if (type() == Type::Rect)
@ -118,10 +123,16 @@ public:
return is_valid();
}
int as_int() const
int as_i32() const
{
ASSERT(type() == Type::Int);
return m_value.as_int;
ASSERT(type() == Type::Int32);
return m_value.as_i32;
}
int as_i64() const
{
ASSERT(type() == Type::Int64);
return m_value.as_i64;
}
unsigned as_uint() const
@ -130,10 +141,13 @@ public:
return m_value.as_uint;
}
int to_int() const
template<typename T>
T to_integer() const
{
if (is_int())
return as_int();
if (is_i32())
return as_i32();
if (is_i64())
return as_i64();
if (is_bool())
return as_bool() ? 1 : 0;
if (is_float())
@ -152,6 +166,16 @@ public:
return 0;
}
i32 to_i32() const
{
return to_integer<i32>();
}
i64 to_i64() const
{
return to_integer<i64>();
}
float as_float() const
{
ASSERT(type() == Type::Float);
@ -244,7 +268,8 @@ private:
GIconImpl* as_icon;
Font* as_font;
bool as_bool;
int as_int;
i32 as_i32;
i64 as_i64;
unsigned as_uint;
float as_float;
RGBA32 as_color;