diff options
Diffstat (limited to 'lldb/include/lldb/Core/StructuredData.h')
-rw-r--r-- | lldb/include/lldb/Core/StructuredData.h | 1204 |
1 files changed, 495 insertions, 709 deletions
diff --git a/lldb/include/lldb/Core/StructuredData.h b/lldb/include/lldb/Core/StructuredData.h index b5816555fe4..71f690011e3 100644 --- a/lldb/include/lldb/Core/StructuredData.h +++ b/lldb/include/lldb/Core/StructuredData.h @@ -23,9 +23,9 @@ #include "llvm/ADT/StringRef.h" // Project includes -#include "lldb/lldb-defines.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/Stream.h" +#include "lldb/lldb-defines.h" namespace lldb_private { @@ -34,725 +34,511 @@ namespace lldb_private { /// @brief A class which can hold structured data /// /// The StructuredData class is designed to hold the data from a JSON -/// or plist style file -- a serialized data structure with dictionaries -/// (maps, hashes), arrays, and concrete values like integers, floating +/// or plist style file -- a serialized data structure with dictionaries +/// (maps, hashes), arrays, and concrete values like integers, floating /// point numbers, strings, booleans. /// /// StructuredData does not presuppose any knowledge of the schema for /// the data it is holding; it can parse JSON data, for instance, and /// other parts of lldb can iterate through the parsed data set to find -/// keys and values that may be present. +/// keys and values that may be present. //---------------------------------------------------------------------- -class StructuredData -{ +class StructuredData { public: - class Object; - class Array; - class Integer; - class Float; - class Boolean; - class String; - class Dictionary; - class Generic; - - typedef std::shared_ptr<Object> ObjectSP; - typedef std::shared_ptr<Array> ArraySP; - typedef std::shared_ptr<Integer> IntegerSP; - typedef std::shared_ptr<Float> FloatSP; - typedef std::shared_ptr<Boolean> BooleanSP; - typedef std::shared_ptr<String> StringSP; - typedef std::shared_ptr<Dictionary> DictionarySP; - typedef std::shared_ptr<Generic> GenericSP; - - enum class Type - { - eTypeInvalid = -1, - eTypeNull = 0, - eTypeGeneric, - eTypeArray, - eTypeInteger, - eTypeFloat, - eTypeBoolean, - eTypeString, - eTypeDictionary - }; - - class Object : - public std::enable_shared_from_this<Object> - { - public: - - Object (Type t = Type::eTypeInvalid) : - m_type (t) - { - } - - virtual ~Object() = default; - - virtual bool - IsValid() const - { - return true; - } - - virtual void - Clear () - { - m_type = Type::eTypeInvalid; - } - - Type - GetType () const - { - return m_type; - } - - void - SetType (Type t) - { - m_type = t; - } - - Array * - GetAsArray () - { - return ((m_type == Type::eTypeArray) ? static_cast<Array *>(this) : nullptr); - } - - Dictionary * - GetAsDictionary () - { - return ((m_type == Type::eTypeDictionary) ? static_cast<Dictionary *>(this) : nullptr); - } - - Integer * - GetAsInteger () - { - return ((m_type == Type::eTypeInteger) ? static_cast<Integer *>(this) : nullptr); - } - - uint64_t - GetIntegerValue (uint64_t fail_value = 0) - { - Integer *integer = GetAsInteger (); - return ((integer != nullptr) ? integer->GetValue() : fail_value); - } - - Float * - GetAsFloat () - { - return ((m_type == Type::eTypeFloat) ? static_cast<Float *>(this) : nullptr); - } - - double - GetFloatValue (double fail_value = 0.0) - { - Float *f = GetAsFloat (); - return ((f != nullptr) ? f->GetValue() : fail_value); - } - - Boolean * - GetAsBoolean () - { - return ((m_type == Type::eTypeBoolean) ? static_cast<Boolean *>(this) : nullptr); - } - - bool - GetBooleanValue (bool fail_value = false) - { - Boolean *b = GetAsBoolean (); - return ((b != nullptr) ? b->GetValue() : fail_value); - } - - String * - GetAsString () - { - return ((m_type == Type::eTypeString) ? static_cast<String *>(this) : nullptr); - } - - std::string - GetStringValue(const char *fail_value = nullptr) - { - String *s = GetAsString (); - if (s) - return s->GetValue(); - - if (fail_value && fail_value[0]) - return std::string(fail_value); - - return std::string(); - } - - Generic * - GetAsGeneric() - { - return ((m_type == Type::eTypeGeneric) ? static_cast<Generic *>(this) : nullptr); - } - - ObjectSP - GetObjectForDotSeparatedPath (llvm::StringRef path); - - void DumpToStdout(bool pretty_print = true) const; - - virtual void - Dump (Stream &s, bool pretty_print = true) const = 0; - - private: - Type m_type; - }; - - class Array : public Object - { - public: - Array () : - Object (Type::eTypeArray) - { - } - - ~Array() override = default; - - bool - ForEach (std::function <bool(Object* object)> const &foreach_callback) const - { - for (const auto &object_sp : m_items) - { - if (foreach_callback(object_sp.get()) == false) - return false; - } - return true; - } - - size_t - GetSize() const - { - return m_items.size(); - } - - ObjectSP - operator[](size_t idx) - { - if (idx < m_items.size()) - return m_items[idx]; - return ObjectSP(); - } - - ObjectSP - GetItemAtIndex(size_t idx) const - { - assert(idx < GetSize()); - if (idx < m_items.size()) - return m_items[idx]; - return ObjectSP(); - } - - template <class IntType> - bool - GetItemAtIndexAsInteger(size_t idx, IntType &result) const - { - ObjectSP value_sp = GetItemAtIndex(idx); - if (value_sp.get()) - { - if (auto int_value = value_sp->GetAsInteger()) - { - result = static_cast<IntType>(int_value->GetValue()); - return true; - } - } - return false; - } - - template <class IntType> - bool - GetItemAtIndexAsInteger(size_t idx, IntType &result, IntType default_val) const - { - bool success = GetItemAtIndexAsInteger(idx, result); - if (!success) - result = default_val; - return success; - } - - bool - GetItemAtIndexAsString(size_t idx, std::string &result) const - { - ObjectSP value_sp = GetItemAtIndex(idx); - if (value_sp.get()) - { - if (auto string_value = value_sp->GetAsString()) - { - result = string_value->GetValue(); - return true; - } - } - return false; - } - - bool - GetItemAtIndexAsString(size_t idx, std::string &result, const std::string &default_val) const - { - bool success = GetItemAtIndexAsString(idx, result); - if (!success) - result = default_val; - return success; - } - - bool - GetItemAtIndexAsString(size_t idx, ConstString &result) const - { - ObjectSP value_sp = GetItemAtIndex(idx); - if (value_sp.get()) { - if (auto string_value = value_sp->GetAsString()) - { - result = ConstString(string_value->GetValue()); - return true; - } - } - return false; - } - - bool - GetItemAtIndexAsString(size_t idx, ConstString &result, const char *default_val) const - { - bool success = GetItemAtIndexAsString(idx, result); - if (!success) - result.SetCString(default_val); - return success; - } - - bool - GetItemAtIndexAsDictionary(size_t idx, Dictionary *&result) const - { - result = nullptr; - ObjectSP value_sp = GetItemAtIndex(idx); - if (value_sp.get()) - { - result = value_sp->GetAsDictionary(); - return (result != nullptr); - } - return false; - } - - bool - GetItemAtIndexAsArray(size_t idx, Array *&result) const - { - result = nullptr; - ObjectSP value_sp = GetItemAtIndex(idx); - if (value_sp.get()) - { - result = value_sp->GetAsArray(); - return (result != nullptr); - } - return false; - } - - void - Push(ObjectSP item) - { - m_items.push_back(item); - } - - void - AddItem(ObjectSP item) - { - m_items.push_back(item); - } - - void Dump(Stream &s, bool pretty_print = true) const override; - - protected: - typedef std::vector<ObjectSP> collection; - collection m_items; - }; - - class Integer : public Object - { - public: - Integer (uint64_t i = 0) : - Object (Type::eTypeInteger), - m_value (i) - { - } - - ~Integer() override = default; - - void - SetValue (uint64_t value) - { - m_value = value; - } - - uint64_t - GetValue () - { - return m_value; - } - - void Dump(Stream &s, bool pretty_print = true) const override; - - protected: - uint64_t m_value; - }; - - class Float : public Object - { - public: - Float (double d = 0.0) : - Object (Type::eTypeFloat), - m_value (d) - { - } - - ~Float() override = default; - - void - SetValue (double value) - { - m_value = value; - } - - double - GetValue () - { - return m_value; - } - - void Dump(Stream &s, bool pretty_print = true) const override; - - protected: - double m_value; - }; - - class Boolean : public Object - { - public: - Boolean (bool b = false) : - Object (Type::eTypeBoolean), - m_value (b) - { - } - - ~Boolean() override = default; - - void - SetValue (bool value) - { - m_value = value; - } - - bool - GetValue () - { - return m_value; - } - - void Dump(Stream &s, bool pretty_print = true) const override; - - protected: - bool m_value; - }; - - class String : public Object - { - public: - String(const char *cstr = nullptr) : - Object (Type::eTypeString), - m_value () - { - if (cstr) - m_value = cstr; - } - - String (const std::string &s) : - Object (Type::eTypeString), - m_value (s) - { - } - - String (const std::string &&s) : - Object (Type::eTypeString), - m_value (s) - { - } - - void - SetValue (const std::string &string) - { - m_value = string; - } - - const std::string & - GetValue () - { - return m_value; - } - - void Dump(Stream &s, bool pretty_print = true) const override; - - protected: - std::string m_value; - }; - - class Dictionary : public Object - { - public: - - Dictionary () : - Object (Type::eTypeDictionary), - m_dict () - { - } - - ~Dictionary() override = default; - - size_t - GetSize() const - { - return m_dict.size(); - } - - void - ForEach (std::function <bool(ConstString key, Object* object)> const &callback) const - { - for (const auto &pair : m_dict) - { - if (callback (pair.first, pair.second.get()) == false) - break; - } - } - - ObjectSP - GetKeys() const - { - ObjectSP object_sp(new Array ()); - Array *array = object_sp->GetAsArray(); - collection::const_iterator iter; - for (iter = m_dict.begin(); iter != m_dict.end(); ++iter) - { - ObjectSP key_object_sp(new String()); - key_object_sp->GetAsString()->SetValue(iter->first.AsCString()); - array->Push(key_object_sp); - } - return object_sp; - } - - ObjectSP - GetValueForKey(llvm::StringRef key) const - { - ObjectSP value_sp; - if (!key.empty()) - { - ConstString key_cs(key); - collection::const_iterator iter = m_dict.find(key_cs); - if (iter != m_dict.end()) - value_sp = iter->second; - } - return value_sp; - } - - template <class IntType> - bool - GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const - { - ObjectSP value_sp = GetValueForKey(key); - if (value_sp) { - if (auto int_value = value_sp->GetAsInteger()) - { - result = static_cast<IntType>(int_value->GetValue()); - return true; - } - } - return false; - } - - template <class IntType> - bool - GetValueForKeyAsInteger(llvm::StringRef key, IntType &result, IntType default_val) const - { - bool success = GetValueForKeyAsInteger<IntType>(key, result); - if (!success) - result = default_val; - return success; - } - - bool - GetValueForKeyAsString(llvm::StringRef key, std::string &result) const - { - ObjectSP value_sp = GetValueForKey(key); - if (value_sp.get()) - { - if (auto string_value = value_sp->GetAsString()) - { - result = string_value->GetValue(); - return true; - } - } - return false; - } - - bool - GetValueForKeyAsString(llvm::StringRef key, std::string &result, const char *default_val) const - { - bool success = GetValueForKeyAsString(key, result); - if (!success) - { - if (default_val) - result = default_val; - else - result.clear(); - } - return success; - } - - bool - GetValueForKeyAsString(llvm::StringRef key, ConstString &result) const - { - ObjectSP value_sp = GetValueForKey(key); - if (value_sp.get()) - { - if (auto string_value = value_sp->GetAsString()) - { - result = ConstString(string_value->GetValue()); - return true; - } - } - return false; - } - - bool - GetValueForKeyAsString(llvm::StringRef key, ConstString &result, const char *default_val) const - { - bool success = GetValueForKeyAsString(key, result); - if (!success) - result.SetCString(default_val); - return success; - } - - bool - GetValueForKeyAsDictionary(llvm::StringRef key, Dictionary *&result) const - { - result = nullptr; - ObjectSP value_sp = GetValueForKey(key); - if (value_sp.get()) - { - result = value_sp->GetAsDictionary(); - return (result != nullptr); - } - return false; - } - - bool - GetValueForKeyAsArray(llvm::StringRef key, Array *&result) const - { - result = nullptr; - ObjectSP value_sp = GetValueForKey(key); - if (value_sp.get()) - { - result = value_sp->GetAsArray(); - return (result != nullptr); - } - return false; - } - - bool - HasKey(llvm::StringRef key) const - { - ConstString key_cs(key); - collection::const_iterator search = m_dict.find(key_cs); - return search != m_dict.end(); - } - - void - AddItem (llvm::StringRef key, ObjectSP value_sp) - { - ConstString key_cs(key); - m_dict[key_cs] = value_sp; - } - - void - AddIntegerItem (llvm::StringRef key, uint64_t value) - { - AddItem (key, ObjectSP (new Integer(value))); - } - - void - AddFloatItem (llvm::StringRef key, double value) - { - AddItem (key, ObjectSP (new Float(value))); - } - - void - AddStringItem (llvm::StringRef key, std::string value) - { - AddItem (key, ObjectSP (new String(std::move(value)))); - } - - void - AddBooleanItem (llvm::StringRef key, bool value) - { - AddItem (key, ObjectSP (new Boolean(value))); - } - - void Dump(Stream &s, bool pretty_print = true) const override; - - protected: - typedef std::map<ConstString, ObjectSP> collection; - collection m_dict; - }; - - class Null : public Object - { - public: - Null () : - Object (Type::eTypeNull) - { - } - - ~Null() override = default; - - bool - IsValid() const override - { - return false; - } - - void Dump(Stream &s, bool pretty_print = true) const override; - }; - - class Generic : public Object - { - public: - explicit Generic(void *object = nullptr) : - Object (Type::eTypeGeneric), - m_object (object) - { - } - - void - SetValue(void *value) - { - m_object = value; - } - - void * - GetValue() const - { - return m_object; - } - - bool - IsValid() const override - { - return m_object != nullptr; - } + class Object; + class Array; + class Integer; + class Float; + class Boolean; + class String; + class Dictionary; + class Generic; + + typedef std::shared_ptr<Object> ObjectSP; + typedef std::shared_ptr<Array> ArraySP; + typedef std::shared_ptr<Integer> IntegerSP; + typedef std::shared_ptr<Float> FloatSP; + typedef std::shared_ptr<Boolean> BooleanSP; + typedef std::shared_ptr<String> StringSP; + typedef std::shared_ptr<Dictionary> DictionarySP; + typedef std::shared_ptr<Generic> GenericSP; + + enum class Type { + eTypeInvalid = -1, + eTypeNull = 0, + eTypeGeneric, + eTypeArray, + eTypeInteger, + eTypeFloat, + eTypeBoolean, + eTypeString, + eTypeDictionary + }; + + class Object : public std::enable_shared_from_this<Object> { + public: + Object(Type t = Type::eTypeInvalid) : m_type(t) {} + + virtual ~Object() = default; + + virtual bool IsValid() const { return true; } + + virtual void Clear() { m_type = Type::eTypeInvalid; } + + Type GetType() const { return m_type; } + + void SetType(Type t) { m_type = t; } + + Array *GetAsArray() { + return ((m_type == Type::eTypeArray) ? static_cast<Array *>(this) + : nullptr); + } + + Dictionary *GetAsDictionary() { + return ((m_type == Type::eTypeDictionary) + ? static_cast<Dictionary *>(this) + : nullptr); + } + + Integer *GetAsInteger() { + return ((m_type == Type::eTypeInteger) ? static_cast<Integer *>(this) + : nullptr); + } + + uint64_t GetIntegerValue(uint64_t fail_value = 0) { + Integer *integer = GetAsInteger(); + return ((integer != nullptr) ? integer->GetValue() : fail_value); + } + + Float *GetAsFloat() { + return ((m_type == Type::eTypeFloat) ? static_cast<Float *>(this) + : nullptr); + } + + double GetFloatValue(double fail_value = 0.0) { + Float *f = GetAsFloat(); + return ((f != nullptr) ? f->GetValue() : fail_value); + } + + Boolean *GetAsBoolean() { + return ((m_type == Type::eTypeBoolean) ? static_cast<Boolean *>(this) + : nullptr); + } + + bool GetBooleanValue(bool fail_value = false) { + Boolean *b = GetAsBoolean(); + return ((b != nullptr) ? b->GetValue() : fail_value); + } + + String *GetAsString() { + return ((m_type == Type::eTypeString) ? static_cast<String *>(this) + : nullptr); + } + + std::string GetStringValue(const char *fail_value = nullptr) { + String *s = GetAsString(); + if (s) + return s->GetValue(); + + if (fail_value && fail_value[0]) + return std::string(fail_value); + + return std::string(); + } + + Generic *GetAsGeneric() { + return ((m_type == Type::eTypeGeneric) ? static_cast<Generic *>(this) + : nullptr); + } + + ObjectSP GetObjectForDotSeparatedPath(llvm::StringRef path); + + void DumpToStdout(bool pretty_print = true) const; + + virtual void Dump(Stream &s, bool pretty_print = true) const = 0; + + private: + Type m_type; + }; + + class Array : public Object { + public: + Array() : Object(Type::eTypeArray) {} + + ~Array() override = default; + + bool + ForEach(std::function<bool(Object *object)> const &foreach_callback) const { + for (const auto &object_sp : m_items) { + if (foreach_callback(object_sp.get()) == false) + return false; + } + return true; + } + + size_t GetSize() const { return m_items.size(); } + + ObjectSP operator[](size_t idx) { + if (idx < m_items.size()) + return m_items[idx]; + return ObjectSP(); + } + + ObjectSP GetItemAtIndex(size_t idx) const { + assert(idx < GetSize()); + if (idx < m_items.size()) + return m_items[idx]; + return ObjectSP(); + } + + template <class IntType> + bool GetItemAtIndexAsInteger(size_t idx, IntType &result) const { + ObjectSP value_sp = GetItemAtIndex(idx); + if (value_sp.get()) { + if (auto int_value = value_sp->GetAsInteger()) { + result = static_cast<IntType>(int_value->GetValue()); + return true; + } + } + return false; + } + + template <class IntType> + bool GetItemAtIndexAsInteger(size_t idx, IntType &result, + IntType default_val) const { + bool success = GetItemAtIndexAsInteger(idx, result); + if (!success) + result = default_val; + return success; + } + + bool GetItemAtIndexAsString(size_t idx, std::string &result) const { + ObjectSP value_sp = GetItemAtIndex(idx); + if (value_sp.get()) { + if (auto string_value = value_sp->GetAsString()) { + result = string_value->GetValue(); + return true; + } + } + return false; + } + + bool GetItemAtIndexAsString(size_t idx, std::string &result, + const std::string &default_val) const { + bool success = GetItemAtIndexAsString(idx, result); + if (!success) + result = default_val; + return success; + } + + bool GetItemAtIndexAsString(size_t idx, ConstString &result) const { + ObjectSP value_sp = GetItemAtIndex(idx); + if (value_sp.get()) { + if (auto string_value = value_sp->GetAsString()) { + result = ConstString(string_value->GetValue()); + return true; + } + } + return false; + } - void Dump(Stream &s, bool pretty_print = true) const override; + bool GetItemAtIndexAsString(size_t idx, ConstString &result, + const char *default_val) const { + bool success = GetItemAtIndexAsString(idx, result); + if (!success) + result.SetCString(default_val); + return success; + } - private: - void *m_object; - }; + bool GetItemAtIndexAsDictionary(size_t idx, Dictionary *&result) const { + result = nullptr; + ObjectSP value_sp = GetItemAtIndex(idx); + if (value_sp.get()) { + result = value_sp->GetAsDictionary(); + return (result != nullptr); + } + return false; + } - static ObjectSP - ParseJSON (std::string json_text); + bool GetItemAtIndexAsArray(size_t idx, Array *&result) const { + result = nullptr; + ObjectSP value_sp = GetItemAtIndex(idx); + if (value_sp.get()) { + result = value_sp->GetAsArray(); + return (result != nullptr); + } + return false; + } + + void Push(ObjectSP item) { m_items.push_back(item); } + + void AddItem(ObjectSP item) { m_items.push_back(item); } + + void Dump(Stream &s, bool pretty_print = true) const override; + + protected: + typedef std::vector<ObjectSP> collection; + collection m_items; + }; + + class Integer : public Object { + public: + Integer(uint64_t i = 0) : Object(Type::eTypeInteger), m_value(i) {} + + ~Integer() override = default; + + void SetValue(uint64_t value) { m_value = value; } + + uint64_t GetValue() { return m_value; } + + void Dump(Stream &s, bool pretty_print = true) const override; + + protected: + uint64_t m_value; + }; + + class Float : public Object { + public: + Float(double d = 0.0) : Object(Type::eTypeFloat), m_value(d) {} + + ~Float() override = default; + + void SetValue(double value) { m_value = value; } + + double GetValue() { return m_value; } + + void Dump(Stream &s, bool pretty_print = true) const override; + + protected: + double m_value; + }; + + class Boolean : public Object { + public: + Boolean(bool b = false) : Object(Type::eTypeBoolean), m_value(b) {} + + ~Boolean() override = default; + + void SetValue(bool value) { m_value = value; } + + bool GetValue() { return m_value; } + + void Dump(Stream &s, bool pretty_print = true) const override; + + protected: + bool m_value; + }; + + class String : public Object { + public: + String(const char *cstr = nullptr) : Object(Type::eTypeString), m_value() { + if (cstr) + m_value = cstr; + } + + String(const std::string &s) : Object(Type::eTypeString), m_value(s) {} + + String(const std::string &&s) : Object(Type::eTypeString), m_value(s) {} + + void SetValue(const std::string &string) { m_value = string; } + + const std::string &GetValue() { return m_value; } + + void Dump(Stream &s, bool pretty_print = true) const override; + + protected: + std::string m_value; + }; + + class Dictionary : public Object { + public: + Dictionary() : Object(Type::eTypeDictionary), m_dict() {} + + ~Dictionary() override = default; + + size_t GetSize() const { return m_dict.size(); } + + void ForEach(std::function<bool(ConstString key, Object *object)> const + &callback) const { + for (const auto &pair : m_dict) { + if (callback(pair.first, pair.second.get()) == false) + break; + } + } + + ObjectSP GetKeys() const { + ObjectSP object_sp(new Array()); + Array *array = object_sp->GetAsArray(); + collection::const_iterator iter; + for (iter = m_dict.begin(); iter != m_dict.end(); ++iter) { + ObjectSP key_object_sp(new String()); + key_object_sp->GetAsString()->SetValue(iter->first.AsCString()); + array->Push(key_object_sp); + } + return object_sp; + } + + ObjectSP GetValueForKey(llvm::StringRef key) const { + ObjectSP value_sp; + if (!key.empty()) { + ConstString key_cs(key); + collection::const_iterator iter = m_dict.find(key_cs); + if (iter != m_dict.end()) + value_sp = iter->second; + } + return value_sp; + } + + template <class IntType> + bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const { + ObjectSP value_sp = GetValueForKey(key); + if (value_sp) { + if (auto int_value = value_sp->GetAsInteger()) { + result = static_cast<IntType>(int_value->GetValue()); + return true; + } + } + return false; + } + + template <class IntType> + bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result, + IntType default_val) const { + bool success = GetValueForKeyAsInteger<IntType>(key, result); + if (!success) + result = default_val; + return success; + } + + bool GetValueForKeyAsString(llvm::StringRef key, + std::string &result) const { + ObjectSP value_sp = GetValueForKey(key); + if (value_sp.get()) { + if (auto string_value = value_sp->GetAsString()) { + result = string_value->GetValue(); + return true; + } + } + return false; + } + + bool GetValueForKeyAsString(llvm::StringRef key, std::string &result, + const char *default_val) const { + bool success = GetValueForKeyAsString(key, result); + if (!success) { + if (default_val) + result = default_val; + else + result.clear(); + } + return success; + } + + bool GetValueForKeyAsString(llvm::StringRef key, + ConstString &result) const { + ObjectSP value_sp = GetValueForKey(key); + if (value_sp.get()) { + if (auto string_value = value_sp->GetAsString()) { + result = ConstString(string_value->GetValue()); + return true; + } + } + return false; + } + + bool GetValueForKeyAsString(llvm::StringRef key, ConstString &result, + const char *default_val) const { + bool success = GetValueForKeyAsString(key, result); + if (!success) + result.SetCString(default_val); + return success; + } + + bool GetValueForKeyAsDictionary(llvm::StringRef key, + Dictionary *&result) const { + result = nullptr; + ObjectSP value_sp = GetValueForKey(key); + if (value_sp.get()) { + result = value_sp->GetAsDictionary(); + return (result != nullptr); + } + return false; + } + + bool GetValueForKeyAsArray(llvm::StringRef key, Array *&result) const { + result = nullptr; + ObjectSP value_sp = GetValueForKey(key); + if (value_sp.get()) { + result = value_sp->GetAsArray(); + return (result != nullptr); + } + return false; + } + + bool HasKey(llvm::StringRef key) const { + ConstString key_cs(key); + collection::const_iterator search = m_dict.find(key_cs); + return search != m_dict.end(); + } + + void AddItem(llvm::StringRef key, ObjectSP value_sp) { + ConstString key_cs(key); + m_dict[key_cs] = value_sp; + } + + void AddIntegerItem(llvm::StringRef key, uint64_t value) { + AddItem(key, ObjectSP(new Integer(value))); + } + + void AddFloatItem(llvm::StringRef key, double value) { + AddItem(key, ObjectSP(new Float(value))); + } + + void AddStringItem(llvm::StringRef key, std::string value) { + AddItem(key, ObjectSP(new String(std::move(value)))); + } + + void AddBooleanItem(llvm::StringRef key, bool value) { + AddItem(key, ObjectSP(new Boolean(value))); + } + + void Dump(Stream &s, bool pretty_print = true) const override; + + protected: + typedef std::map<ConstString, ObjectSP> collection; + collection m_dict; + }; + + class Null : public Object { + public: + Null() : Object(Type::eTypeNull) {} + + ~Null() override = default; + + bool IsValid() const override { return false; } + + void Dump(Stream &s, bool pretty_print = true) const override; + }; + + class Generic : public Object { + public: + explicit Generic(void *object = nullptr) + : Object(Type::eTypeGeneric), m_object(object) {} + + void SetValue(void *value) { m_object = value; } + + void *GetValue() const { return m_object; } + + bool IsValid() const override { return m_object != nullptr; } + + void Dump(Stream &s, bool pretty_print = true) const override; + + private: + void *m_object; + }; + + static ObjectSP ParseJSON(std::string json_text); }; } // namespace lldb_private |