Riyyi
3 years ago
4 changed files with 253 additions and 0 deletions
@ -0,0 +1,39 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef JSON_ARRAY_H |
||||||
|
#define JSON_ARRAY_H |
||||||
|
|
||||||
|
#include <utility> // move |
||||||
|
#include <vector> |
||||||
|
|
||||||
|
#include "util/json/parser.h" |
||||||
|
|
||||||
|
namespace Json { |
||||||
|
|
||||||
|
class Array { |
||||||
|
public: |
||||||
|
Array() {} |
||||||
|
virtual ~Array() {} |
||||||
|
|
||||||
|
Array(const Array& other) |
||||||
|
: m_values(other.m_values) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void emplace(Value value) |
||||||
|
{ |
||||||
|
m_values.emplace_back(std::move(value)); |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
std::vector<Value> m_values; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace Json
|
||||||
|
|
||||||
|
|
||||||
|
#endif // JSON_ARRAY_H
|
@ -0,0 +1,41 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef JSON_OBJECT_H |
||||||
|
#define JSON_OBJECT_H |
||||||
|
|
||||||
|
#include <map> |
||||||
|
#include <string> |
||||||
|
#include <utility> // move |
||||||
|
|
||||||
|
#include "util/json/parser.h" |
||||||
|
|
||||||
|
namespace Json { |
||||||
|
|
||||||
|
class Object { |
||||||
|
public: |
||||||
|
Object() {} |
||||||
|
virtual ~Object() {} |
||||||
|
|
||||||
|
Object(const Object& other) |
||||||
|
: m_members(other.m_members) |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
void emplace(const std::string& key, Value value) |
||||||
|
{ |
||||||
|
m_members.emplace(key, std::move(value)); |
||||||
|
} |
||||||
|
|
||||||
|
const std::map<std::string, Value>& members() const { return m_members; } |
||||||
|
|
||||||
|
private: |
||||||
|
std::map<std::string, Value> m_members; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace Json
|
||||||
|
|
||||||
|
#endif // JSON_OBJECT_H
|
@ -0,0 +1,107 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <string> |
||||||
|
#include <utility> // move |
||||||
|
|
||||||
|
#include "util/json/array.h" |
||||||
|
#include "util/json/object.h" |
||||||
|
#include "util/json/value.h" |
||||||
|
|
||||||
|
namespace Json { |
||||||
|
|
||||||
|
Value::Value(const Value& other) |
||||||
|
{ |
||||||
|
copyFrom(other); |
||||||
|
} |
||||||
|
|
||||||
|
Value& Value::operator=(const Value& other) |
||||||
|
{ |
||||||
|
if (this != &other) { |
||||||
|
clear(); |
||||||
|
copyFrom(other); |
||||||
|
} |
||||||
|
|
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
Value::Value(bool value) |
||||||
|
: m_type(Type::Bool) |
||||||
|
{ |
||||||
|
m_value.asBool = value; |
||||||
|
} |
||||||
|
|
||||||
|
Value::Value(double value) |
||||||
|
: m_type(Type::Number) |
||||||
|
{ |
||||||
|
m_value.asDouble = value; |
||||||
|
} |
||||||
|
|
||||||
|
Value::Value(const char* value) |
||||||
|
: m_type(Type::String) |
||||||
|
{ |
||||||
|
m_value.asString = new std::string(value); |
||||||
|
} |
||||||
|
|
||||||
|
Value::Value(const std::string& value) |
||||||
|
: m_type(Type::String) |
||||||
|
{ |
||||||
|
m_value.asString = new std::string(value); |
||||||
|
} |
||||||
|
|
||||||
|
Value::Value(const Array& value) |
||||||
|
: m_type(Type::Array) |
||||||
|
{ |
||||||
|
m_value.asArray = new Array(value); |
||||||
|
} |
||||||
|
|
||||||
|
Value::Value(const Object& value) |
||||||
|
: m_type(Type::Object) |
||||||
|
{ |
||||||
|
m_value.asObject = new Object(value); |
||||||
|
} |
||||||
|
|
||||||
|
// ------------------------------------------
|
||||||
|
|
||||||
|
void Value::clear() |
||||||
|
{ |
||||||
|
if (m_type == Type::String) { |
||||||
|
delete m_value.asString; |
||||||
|
} |
||||||
|
if (m_type == Type::Array) { |
||||||
|
delete m_value.asArray; |
||||||
|
} |
||||||
|
if (m_type == Type::Object) { |
||||||
|
delete m_value.asObject; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void Value::copyFrom(const Value& other) |
||||||
|
{ |
||||||
|
m_type = other.m_type; |
||||||
|
|
||||||
|
switch (m_type) { |
||||||
|
case Type::Bool: |
||||||
|
m_value.asBool = other.m_value.asBool; |
||||||
|
break; |
||||||
|
case Type::Number: |
||||||
|
m_value.asDouble = other.m_value.asDouble; |
||||||
|
break; |
||||||
|
case Type::String: |
||||||
|
m_value.asString = new std::string(*other.m_value.asString); |
||||||
|
break; |
||||||
|
case Type::Array: |
||||||
|
m_value.asArray = new Array(*other.m_value.asArray); |
||||||
|
break; |
||||||
|
case Type::Object: |
||||||
|
m_value.asObject = new Object(*other.m_value.asObject); |
||||||
|
break; |
||||||
|
default: |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace Json
|
@ -0,0 +1,66 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (C) 2022 Riyyi |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: MIT |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef JSON_VALUE_H |
||||||
|
#define JSON_VALUE_H |
||||||
|
|
||||||
|
#include <string> |
||||||
|
|
||||||
|
namespace Json { |
||||||
|
|
||||||
|
class Array; |
||||||
|
class Object; |
||||||
|
|
||||||
|
class Value { |
||||||
|
public: |
||||||
|
enum class Type { |
||||||
|
Null, // null (case sensitive!)
|
||||||
|
Bool, // true/false (case sensitive!)
|
||||||
|
Number, // 123
|
||||||
|
String, // ""
|
||||||
|
Array, // []
|
||||||
|
Object, // {}
|
||||||
|
}; |
||||||
|
|
||||||
|
Value() {} |
||||||
|
virtual ~Value() { clear(); } |
||||||
|
|
||||||
|
// Copy constructor
|
||||||
|
Value(const Value& other); |
||||||
|
// Assignment operator
|
||||||
|
Value& operator=(const Value& other); |
||||||
|
|
||||||
|
Value(bool value); |
||||||
|
Value(double value); |
||||||
|
Value(const char* value); |
||||||
|
Value(const std::string& value); |
||||||
|
Value(const Array& value); |
||||||
|
Value(const Object& value); |
||||||
|
|
||||||
|
bool asBool() const { return m_value.asBool; } |
||||||
|
double asDouble() const { return m_value.asDouble; } |
||||||
|
const std::string& asString() const { return *m_value.asString; } |
||||||
|
const Array& asArray() const { return *m_value.asArray; } |
||||||
|
const Object& asObject() const { return *m_value.asObject; } |
||||||
|
|
||||||
|
private: |
||||||
|
void clear(); |
||||||
|
void copyFrom(const Value& other); |
||||||
|
|
||||||
|
Type m_type { Type::Null }; |
||||||
|
|
||||||
|
union { |
||||||
|
bool asBool; |
||||||
|
double asDouble; |
||||||
|
std::string* asString; |
||||||
|
Array* asArray; |
||||||
|
Object* asObject; |
||||||
|
} m_value; |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace Json
|
||||||
|
|
||||||
|
#endif // JSON_VALUE_H
|
Loading…
Reference in new issue