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

LibPDF: Differentiate Value's null and empty states

This commit is contained in:
Matthew Olsson 2021-05-24 13:41:40 -07:00 committed by Ali Mohammad Pur
parent bd9e20ef79
commit d654fe0e41
3 changed files with 15 additions and 2 deletions

View file

@ -268,7 +268,7 @@ Value Parser::parse_value()
if (m_reader.matches("null")) { if (m_reader.matches("null")) {
m_reader.move_by(4); m_reader.move_by(4);
consume_whitespace(); consume_whitespace();
return Value(); return Value(Value::NullTag {});
} }
if (m_reader.matches("true")) { if (m_reader.matches("true")) {

View file

@ -19,6 +19,7 @@ Value& Value::operator=(const Value& other)
{ {
m_type = other.m_type; m_type = other.m_type;
switch (m_type) { switch (m_type) {
case Type::Empty:
case Type::Null: case Type::Null:
break; break;
case Type::Bool: case Type::Bool:
@ -45,6 +46,8 @@ Value& Value::operator=(const Value& other)
String Value::to_string(int indent) const String Value::to_string(int indent) const
{ {
switch (m_type) { switch (m_type) {
case Type::Empty:
return "<empty>";
case Type::Null: case Type::Null:
return "null"; return "null";
case Type::Bool: case Type::Bool:

View file

@ -23,6 +23,14 @@ public:
static constexpr auto max_ref_generation_index = (1 << 15) - 1; // 2 ^ 14 - 1 static constexpr auto max_ref_generation_index = (1 << 15) - 1; // 2 ^ 14 - 1
Value() Value()
: m_type(Type::Empty)
{
}
struct NullTag {
};
Value(NullTag)
: m_type(Type::Null) : m_type(Type::Null)
{ {
} }
@ -70,6 +78,7 @@ public:
Value& operator=(const Value& other); Value& operator=(const Value& other);
[[nodiscard]] ALWAYS_INLINE bool is_empty() const { return m_type == Type::Empty; }
[[nodiscard]] ALWAYS_INLINE bool is_null() const { return m_type == Type::Null; } [[nodiscard]] ALWAYS_INLINE bool is_null() const { return m_type == Type::Null; }
[[nodiscard]] ALWAYS_INLINE bool is_bool() const { return m_type == Type::Bool; } [[nodiscard]] ALWAYS_INLINE bool is_bool() const { return m_type == Type::Bool; }
[[nodiscard]] ALWAYS_INLINE bool is_int() const { return m_type == Type::Int; } [[nodiscard]] ALWAYS_INLINE bool is_int() const { return m_type == Type::Int; }
@ -124,12 +133,13 @@ public:
[[nodiscard]] ALWAYS_INLINE NonnullRefPtr<Object> as_object() const { return *m_as_object; } [[nodiscard]] ALWAYS_INLINE NonnullRefPtr<Object> as_object() const { return *m_as_object; }
[[nodiscard]] ALWAYS_INLINE explicit operator bool() const { return !is_null(); } [[nodiscard]] ALWAYS_INLINE explicit operator bool() const { return !is_empty(); }
[[nodiscard]] String to_string(int indent = 0) const; [[nodiscard]] String to_string(int indent = 0) const;
private: private:
enum class Type { enum class Type {
Empty,
Null, Null,
Bool, Bool,
Int, Int,