9#ifndef LLDB_UTILITY_STRUCTUREDDATA_H
10#define LLDB_UTILITY_STRUCTUREDDATA_H
12#include "llvm/ADT/StringMap.h"
13#include "llvm/ADT/StringRef.h"
14#include "llvm/Support/JSON.h"
52 template <
typename N>
class Integer;
75 typedef std::variant<UnsignedIntegerSP, SignedIntegerSP>
IntegerSP;
77 class Object :
public std::enable_shared_from_this<Object> {
84 virtual bool IsValid()
const {
return true; }
94 ?
static_cast<Array *
>(
this)
131 ?
static_cast<Float *
>(
this)
137 return ((f !=
nullptr) ? f->
GetValue() : fail_value);
148 return ((b !=
nullptr) ? b->
GetValue() : fail_value);
153 ?
static_cast<String *
>(
this)
175 virtual void Serialize(llvm::json::OStream &s)
const = 0;
178 llvm::json::OStream jso(s.
AsRawOstream(), pretty_print ? 2 : 0);
199 ForEach(std::function<
bool(
Object *
object)>
const &foreach_callback)
const {
200 for (
const auto &object_sp :
m_items) {
201 if (!foreach_callback(object_sp.get()))
222 template <
class IntType>
225 if (value_sp.get()) {
226 if constexpr (std::numeric_limits<IntType>::is_signed) {
227 if (
auto signed_value = value_sp->GetAsSignedInteger()) {
228 result =
static_cast<IntType
>(signed_value->GetValue());
232 if (
auto unsigned_value = value_sp->GetAsUnsignedInteger()) {
233 result =
static_cast<IntType
>(unsigned_value->GetValue());
241 template <
class IntType>
243 IntType default_val)
const {
246 result = default_val;
252 if (value_sp.get()) {
253 if (
auto string_value = value_sp->GetAsString()) {
254 result = string_value->GetValue();
262 llvm::StringRef default_val)
const {
265 result = default_val;
272 if (value_sp.get()) {
274 return (result !=
nullptr);
282 if (value_sp.get()) {
284 return (result !=
nullptr);
294 static_assert(std::is_integral<T>::value ||
295 std::is_floating_point<T>::value,
296 "value type should be integral");
297 if constexpr (std::numeric_limits<T>::is_signed)
298 AddItem(std::make_shared<SignedInteger>(value));
300 AddItem(std::make_shared<UnsignedInteger>(value));
306 AddItem(std::make_shared<String>(std::move(value)));
310 AddItem(std::make_shared<Boolean>(value));
313 void Serialize(llvm::json::OStream &s)
const override;
324 static_assert(std::is_integral<N>::value,
"N must be an integral type");
328 :
Object(std::numeric_limits<N>::is_signed
329 ?
lldb::eStructuredDataTypeSignedInteger
330 :
lldb::eStructuredDataTypeUnsignedInteger),
339 s.value(
static_cast<N
>(
m_value));
343 s.
Printf(std::numeric_limits<N>::is_signed ?
"%" PRId64 :
"%" PRIu64,
363 void Serialize(llvm::json::OStream &s)
const override;
382 void Serialize(llvm::json::OStream &s)
const override;
400 void Serialize(llvm::json::OStream &s)
const override;
428 for (
const auto &pair :
m_dict) {
429 if (!callback(pair.first(), pair.second.get()))
435 auto array_sp = std::make_shared<Array>();
436 for (
auto iter =
m_dict.begin(); iter !=
m_dict.end(); ++iter) {
437 auto key_object_sp = std::make_shared<String>(iter->first());
438 array_sp->Push(key_object_sp);
444 return m_dict.lookup(key);
448 bool success =
false;
450 if (value_sp.get()) {
460 template <
class IntType>
464 if constexpr (std::numeric_limits<IntType>::is_signed) {
465 if (
auto signed_value = value_sp->GetAsSignedInteger()) {
466 result =
static_cast<IntType
>(signed_value->GetValue());
470 if (
auto unsigned_value = value_sp->GetAsUnsignedInteger()) {
471 result =
static_cast<IntType
>(unsigned_value->GetValue());
479 template <
class IntType>
481 IntType default_val)
const {
482 bool success = GetValueForKeyAsInteger<IntType>(key, result);
484 result = default_val;
489 llvm::StringRef &result)
const {
491 if (value_sp.get()) {
492 if (
auto string_value = value_sp->GetAsString()) {
493 result = string_value->GetValue();
501 const char *default_val)
const {
505 result = default_val;
507 result = llvm::StringRef();
516 if (value_sp.get()) {
518 return (result !=
nullptr);
526 if (value_sp.get()) {
528 return (result !=
nullptr);
533 bool HasKey(llvm::StringRef key)
const {
return m_dict.contains(key); }
536 m_dict.insert_or_assign(key, std::move(value_sp));
540 static_assert(std::is_integral<T>::value ||
541 std::is_floating_point<T>::value,
542 "value type should be integral");
543 if constexpr (std::numeric_limits<T>::is_signed)
544 AddItem(key, std::make_shared<SignedInteger>(value));
546 AddItem(key, std::make_shared<UnsignedInteger>(value));
550 AddItem(key, std::make_shared<Float>(value));
554 AddItem(key, std::make_shared<String>(std::move(value)));
558 AddItem(key, std::make_shared<Boolean>(value));
561 void Serialize(llvm::json::OStream &s)
const override;
575 bool IsValid()
const override {
return false; }
577 void Serialize(llvm::json::OStream &s)
const override;
593 void Serialize(llvm::json::OStream &s)
const override;
static llvm::raw_ostream & error(Stream &strm)
A stream class that can stream formatted output to a file.
llvm::raw_ostream & AsRawOstream()
Returns a raw_ostream that forwards the data to this Stream object.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
void IndentLess(unsigned amount=2)
Decrement the current indentation level.
void IndentMore(unsigned amount=2)
Increment the current indentation level.
~Array() override=default
void AddItem(const ObjectSP &item)
void AddIntegerItem(T value)
void Serialize(llvm::json::OStream &s) const override
void AddFloatItem(double value)
ObjectSP GetItemAtIndex(size_t idx) const
void AddStringItem(llvm::StringRef value)
void AddBooleanItem(bool value)
bool GetItemAtIndexAsString(size_t idx, llvm::StringRef &result) const
std::vector< ObjectSP > collection
void GetDescription(lldb_private::Stream &s) const override
bool ForEach(std::function< bool(Object *object)> const &foreach_callback) const
ObjectSP operator[](size_t idx)
void Push(const ObjectSP &item)
bool GetItemAtIndexAsString(size_t idx, llvm::StringRef &result, llvm::StringRef default_val) const
bool GetItemAtIndexAsArray(size_t idx, Array *&result) const
bool GetItemAtIndexAsDictionary(size_t idx, Dictionary *&result) const
bool GetItemAtIndexAsInteger(size_t idx, IntType &result, IntType default_val) const
bool GetItemAtIndexAsInteger(size_t idx, IntType &result) const
void Serialize(llvm::json::OStream &s) const override
~Boolean() override=default
void SetValue(bool value)
void GetDescription(lldb_private::Stream &s) const override
void AddBooleanItem(llvm::StringRef key, bool value)
void Serialize(llvm::json::OStream &s) const override
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
~Dictionary() override=default
Dictionary(ObjectSP obj_sp)
bool GetValueForKeyAsBoolean(llvm::StringRef key, bool &result) const
void AddFloatItem(llvm::StringRef key, double value)
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result, IntType default_val) const
llvm::StringMap< ObjectSP > m_dict
void AddIntegerItem(llvm::StringRef key, T value)
ObjectSP GetValueForKey(llvm::StringRef key) const
void AddStringItem(llvm::StringRef key, llvm::StringRef value)
void GetDescription(lldb_private::Stream &s) const override
bool HasKey(llvm::StringRef key) const
void AddItem(llvm::StringRef key, ObjectSP value_sp)
bool GetValueForKeyAsArray(llvm::StringRef key, Array *&result) const
void ForEach(std::function< bool(llvm::StringRef key, Object *object)> const &callback) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result, const char *default_val) const
bool GetValueForKeyAsDictionary(llvm::StringRef key, Dictionary *&result) const
void SetValue(double value)
~Float() override=default
void Serialize(llvm::json::OStream &s) const override
void GetDescription(lldb_private::Stream &s) const override
void SetValue(void *value)
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
Generic(void *object=nullptr)
bool IsValid() const override
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
~Integer() override=default
void GetDescription(lldb_private::Stream &s) const override
bool IsValid() const override
void Serialize(llvm::json::OStream &s) const override
Dictionary * GetAsDictionary()
lldb::StructuredDataType m_type
virtual void Serialize(llvm::json::OStream &s) const =0
llvm::StringRef GetStringValue(const char *fail_value=nullptr)
void DumpToStdout(bool pretty_print=true) const
virtual void GetDescription(lldb_private::Stream &s) const
double GetFloatValue(double fail_value=0.0)
UnsignedInteger * GetAsUnsignedInteger()
virtual bool IsValid() const
Object(lldb::StructuredDataType t=lldb::eStructuredDataTypeInvalid)
int64_t GetSignedIntegerValue(int64_t fail_value=0)
bool GetBooleanValue(bool fail_value=false)
void SetType(lldb::StructuredDataType t)
void Dump(lldb_private::Stream &s, bool pretty_print=true) const
lldb::StructuredDataType GetType() const
SignedInteger * GetAsSignedInteger()
uint64_t GetUnsignedIntegerValue(uint64_t fail_value=0)
ObjectSP GetObjectForDotSeparatedPath(llvm::StringRef path)
virtual ~Object()=default
void GetDescription(lldb_private::Stream &s) const override
void SetValue(llvm::StringRef S)
llvm::StringRef GetValue()
void Serialize(llvm::json::OStream &s) const override
String(llvm::StringRef S)
A class which can hold structured data.
static bool IsRecordType(const ObjectSP object_sp)
std::shared_ptr< Generic > GenericSP
std::shared_ptr< UnsignedInteger > UnsignedIntegerSP
std::shared_ptr< Float > FloatSP
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
static ObjectSP ParseJSON(llvm::StringRef json_text)
std::shared_ptr< String > StringSP
std::shared_ptr< Array > ArraySP
std::shared_ptr< Boolean > BooleanSP
static ObjectSP ParseJSONFromFile(const FileSpec &file, Status &error)
std::shared_ptr< SignedInteger > SignedIntegerSP
std::variant< UnsignedIntegerSP, SignedIntegerSP > IntegerSP
A class that represents a running process on the host machine.
@ eStructuredDataTypeFloat
@ eStructuredDataTypeDictionary
@ eStructuredDataTypeInvalid
@ eStructuredDataTypeInteger
@ eStructuredDataTypeGeneric
@ eStructuredDataTypeArray
@ eStructuredDataTypeSignedInteger
@ eStructuredDataTypeUnsignedInteger
@ eStructuredDataTypeBoolean
@ eStructuredDataTypeString