mirror of
https://github.com/opnsense/src.git
synced 2026-02-28 12:20:54 -05:00
This corresponds with the branchpoint for the 3.5 release. A number of files not required for the FreeBSD build have been removed. Sponsored by: DARPA, AFRL
486 lines
9.7 KiB
C++
486 lines
9.7 KiB
C++
//===-- 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 <map>
|
|
#include <utility>
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
#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<Object> ObjectSP;
|
|
typedef std::shared_ptr<Array> ArraySP;
|
|
typedef std::shared_ptr<Dictionary> DictionarySP;
|
|
|
|
enum class Type {
|
|
eTypeInvalid = -1,
|
|
eTypeNull = 0,
|
|
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 ()
|
|
{
|
|
}
|
|
|
|
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<ObjectSP> 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<ConstString, ObjectSP> 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_
|