소스 검색

LibPDF: Differentiate Value's null and empty states

Matthew Olsson 4 년 전
부모
커밋
d654fe0e41
3개의 변경된 파일15개의 추가작업 그리고 2개의 파일을 삭제
  1. 1 1
      Userland/Libraries/LibPDF/Parser.cpp
  2. 3 0
      Userland/Libraries/LibPDF/Value.cpp
  3. 11 1
      Userland/Libraries/LibPDF/Value.h

+ 1 - 1
Userland/Libraries/LibPDF/Parser.cpp

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

+ 3 - 0
Userland/Libraries/LibPDF/Value.cpp

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

+ 11 - 1
Userland/Libraries/LibPDF/Value.h

@@ -23,6 +23,14 @@ public:
     static constexpr auto max_ref_generation_index = (1 << 15) - 1; // 2 ^ 14 - 1
 
     Value()
+        : m_type(Type::Empty)
+    {
+    }
+
+    struct NullTag {
+    };
+
+    Value(NullTag)
         : m_type(Type::Null)
     {
     }
@@ -70,6 +78,7 @@ public:
 
     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_bool() const { return m_type == Type::Bool; }
     [[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 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;
 
 private:
     enum class Type {
+        Empty,
         Null,
         Bool,
         Int,