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