//===-- StructuredData.h ----------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef liblldb_StructuredData_h_ #define liblldb_StructuredData_h_ // C Includes // C++ Includes #include #include #include #include #include "llvm/ADT/StringRef.h" // Other libraries and framework includes // Project includes #include "lldb/lldb-defines.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/Stream.h" namespace lldb_private { //---------------------------------------------------------------------- /// @class StructuredData StructuredData.h "lldb/Core/StructuredData.h" /// @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 /// 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. //---------------------------------------------------------------------- class StructuredData { public: class Object; class Array; class Integer; class Float; class Boolean; class String; class Dictionary; typedef std::shared_ptr ObjectSP; typedef std::shared_ptr ArraySP; typedef std::shared_ptr DictionarySP; enum class Type { eTypeInvalid = -1, eTypeNull = 0, eTypeArray, eTypeInteger, eTypeFloat, eTypeBoolean, eTypeString, eTypeDictionary }; class Object : public std::enable_shared_from_this { public: Object (Type t = Type::eTypeInvalid) : m_type (t) { } virtual ~Object () { } virtual void Clear () { m_type = Type::eTypeInvalid; } Type GetType () const { return m_type; } void SetType (Type t) { m_type = t; } Array * GetAsArray () { if (m_type == Type::eTypeArray) return (Array *)this; return NULL; } Dictionary * GetAsDictionary () { if (m_type == Type::eTypeDictionary) return (Dictionary *)this; return NULL; } Integer * GetAsInteger () { if (m_type == Type::eTypeInteger) return (Integer *)this; return NULL; } Float * GetAsFloat () { if (m_type == Type::eTypeFloat) return (Float *)this; return NULL; } Boolean * GetAsBoolean () { if (m_type == Type::eTypeBoolean) return (Boolean *)this; return NULL; } String * GetAsString () { if (m_type == Type::eTypeString) return (String *)this; return NULL; } ObjectSP GetObjectForDotSeparatedPath (llvm::StringRef path); virtual void Dump (Stream &s) const = 0; private: Type m_type; }; class Array : public Object { public: Array () : Object (Type::eTypeArray) { } virtual ~Array() { } size_t GetSize() { 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) { if (idx < m_items.size()) return m_items[idx]; return ObjectSP(); } void Push(ObjectSP item) { m_items.push_back(item); } void AddItem(ObjectSP item) { m_items.push_back(item); } virtual void Dump (Stream &s) const; protected: typedef std::vector collection; collection m_items; }; class Integer : public Object { public: Integer () : Object (Type::eTypeInteger), m_value () { } virtual ~Integer() { } void SetValue (uint64_t value) { m_value = value; } uint64_t GetValue () { return m_value; } virtual void Dump (Stream &s) const; protected: uint64_t m_value; }; class Float : public Object { public: Float () : Object (Type::eTypeFloat), m_value () { } virtual ~Float() { } void SetValue (double value) { m_value = value; } double GetValue () { return m_value; } virtual void Dump (Stream &s) const; protected: double m_value; }; class Boolean : public Object { public: Boolean () : Object (Type::eTypeBoolean), m_value () { } virtual ~Boolean() { } void SetValue (bool value) { m_value = value; } bool GetValue () { return m_value; } virtual void Dump (Stream &s) const; protected: bool m_value; }; class String : public Object { public: String () : Object (Type::eTypeString), m_value () { } void SetValue (std::string string) { m_value = string; } std::string GetValue () { return m_value; } virtual void Dump (Stream &s) const; protected: std::string m_value; }; class Dictionary : public Object { public: Dictionary () : Object (Type::eTypeDictionary), m_dict () { } virtual ~Dictionary() { } size_t GetSize() { return m_dict.size(); } ObjectSP GetKeys() { 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 (const char *key) { ObjectSP value_sp; if (key) { ConstString key_cs(key); for (collection::const_iterator iter = m_dict.begin(); iter != m_dict.end(); ++iter) { if (key_cs == iter->first) { value_sp = iter->second; break; } } } return value_sp; } bool HasKey (const char *key) { ConstString key_cs (key); collection::const_iterator search = m_dict.find(key_cs); if (search != m_dict.end()) { return true; } else { return false; } } void AddItem (const char *key, ObjectSP value) { ConstString key_cs(key); m_dict[key_cs] = value; } void AddIntegerItem (const char *key, uint64_t value) { ObjectSP val_obj (new Integer()); val_obj->GetAsInteger()->SetValue (value); AddItem (key, val_obj); } void AddFloatItem (const char *key, double value) { ObjectSP val_obj (new Float()); val_obj->GetAsFloat()->SetValue (value); AddItem (key, val_obj); } void AddStringItem (const char *key, std::string value) { ObjectSP val_obj (new String()); val_obj->GetAsString()->SetValue (value); AddItem (key, val_obj); } void AddBooleanItem (const char *key, bool value) { ObjectSP val_obj (new Boolean()); val_obj->GetAsBoolean()->SetValue (value); AddItem (key, val_obj); } virtual void Dump (Stream &s) const; protected: typedef std::map collection; collection m_dict; }; class Null : public Object { public: Null () : Object (Type::eTypeNull) { } virtual ~Null() { } virtual void Dump (Stream &s) const; protected: }; static ObjectSP ParseJSON (std::string json_text); }; // class StructuredData } // namespace lldb_private #endif // liblldb_StructuredData_h_