1#ifndef MSTL_CORE_FILE_JSON_JSON_VALUE_HPP__
2#define MSTL_CORE_FILE_JSON_JSON_VALUE_HPP__
3#include "MSTL/core/container/unordered_map.hpp"
4#include "MSTL/core/container/vector.hpp"
6#include "MSTL/core/interface/istringify.hpp"
21class MSTL_API json_value : public istringify<json_value> {
32 virtual ~json_value() =
default;
33 MSTL_NODISCARD
virtual types type() const noexcept = 0;
35 MSTL_NODISCARD virtual const json_null* as_null() const noexcept {
return nullptr; }
36 MSTL_NODISCARD
virtual const json_bool* as_bool() const noexcept {
return nullptr; }
37 MSTL_NODISCARD
virtual const json_number* as_number() const noexcept {
return nullptr; }
38 MSTL_NODISCARD
virtual const json_string* as_string() const noexcept {
return nullptr; }
39 MSTL_NODISCARD
virtual const json_object* as_object() const noexcept {
return nullptr; }
40 MSTL_NODISCARD
virtual const json_array* as_array() const noexcept {
return nullptr; }
42 MSTL_NODISCARD
bool is_null() const noexcept {
return type() == Null; }
43 MSTL_NODISCARD
bool is_bool() const noexcept {
return type() == Bool; }
44 MSTL_NODISCARD
bool is_number() const noexcept {
return type() == Number; }
45 MSTL_NODISCARD
bool is_string() const noexcept {
return type() == String; }
46 MSTL_NODISCARD
bool is_object() const noexcept {
return type() == Object; }
47 MSTL_NODISCARD
bool is_array() const noexcept {
return type() == Array; }
49 MSTL_NODISCARD
string to_string()
const;
55class MSTL_API json_null final :
public json_value {
57 MSTL_NODISCARD types type() const noexcept
override {
return Null; }
58 MSTL_NODISCARD
const json_null* as_null() const noexcept
override {
return this; }
61class MSTL_API json_bool final :
public json_value {
66 explicit json_bool(
const bool v) noexcept : value(v) {}
67 MSTL_NODISCARD types type() const noexcept
override {
return Bool; }
68 MSTL_NODISCARD
const json_bool* as_bool() const noexcept
override {
return this; }
69 MSTL_NODISCARD
bool get_value() const noexcept {
return value; }
72class MSTL_API json_number final :
public json_value {
77 explicit json_number(
const double v) noexcept : value(v) {}
78 MSTL_NODISCARD types type() const noexcept
override {
return Number; }
79 MSTL_NODISCARD
const json_number* as_number() const noexcept
override {
return this; }
80 MSTL_NODISCARD
double get_value() const noexcept {
return value; }
83class MSTL_API json_string final :
public json_value {
88 explicit json_string(
string v) noexcept : value(
_MSTL move(v)) {}
89 MSTL_NODISCARD types type() const noexcept
override {
return String; }
90 MSTL_NODISCARD
const json_string* as_string() const noexcept
override {
return this; }
91 MSTL_NODISCARD
const string& get_value() const noexcept {
return value; }
94class MSTL_API json_object final :
public json_value {
96 unordered_map<string, json_ptr> members{};
99 json_object() =
default;
100 json_object(
const json_object&) =
delete;
101 json_object& operator =(
const json_object&) =
delete;
102 json_object(json_object&&) =
default;
103 json_object& operator =(json_object&&) =
default;
105 MSTL_NODISCARD types type() const noexcept
override {
return Object; }
106 MSTL_NODISCARD
const json_object* as_object() const noexcept
override {
return this; }
108 void add_member(
const string& key, unique_ptr<json_value> value) {
112 MSTL_NODISCARD
const json_value* get_member(
const string& key)
const {
113 const auto it = members.find(key);
114 if (it != members.end())
return it->second.get();
118 MSTL_NODISCARD
const unordered_map<string, json_ptr>& get_members() const noexcept {
123class MSTL_API json_array final :
public json_value {
125 vector<json_ptr> elements;
128 json_array() =
default;
129 json_array(
const json_array&) =
delete;
130 json_array& operator =(
const json_array&) =
delete;
131 json_array(json_array&&) =
default;
132 json_array& operator =(json_array&&) =
default;
134 MSTL_NODISCARD types type() const noexcept
override {
return Array; }
135 MSTL_NODISCARD
const json_array* as_array() const noexcept
override {
return this; }
138 void add_element(unique_ptr<json_value> value) {
139 elements.emplace_back(
_MSTL move(value));
142 MSTL_NODISCARD
const json_value* get_element(
const size_t index)
const noexcept {
143 if (index < elements.size())
return elements[index].get();
147 MSTL_NODISCARD
size_t size() const noexcept {
return elements.size(); }
148 MSTL_NODISCARD
const vector<json_ptr>& get_elements() const noexcept {
return elements; }
152string MSTL_API json_value_to_string(
const json_value* value);
153string MSTL_API json_value_to_indent_string(
const json_value* value,
int indent);
156MSTL_ALWAYS_INLINE_INLINE
string to_string(
const json_value* value) {
157 return _INNER json_value_to_string(value);
159MSTL_ALWAYS_INLINE_INLINE
string to_string(
const json_value& value) {
160 return _INNER json_value_to_string(&value);
162MSTL_ALWAYS_INLINE_INLINE
string to_string(
const json_ptr& value) {
163 return _INNER json_value_to_string(value.
get());
166MSTL_ALWAYS_INLINE_INLINE
string to_indent_string(
const json_value* value) {
167 return _INNER json_value_to_indent_string(value, 0);
169MSTL_ALWAYS_INLINE_INLINE
string to_indent_string(
const json_value& value) {
170 return _INNER json_value_to_indent_string(&value, 0);
172MSTL_ALWAYS_INLINE_INLINE
string to_indent_string(
const json_ptr& value) {
173 return _INNER json_value_to_indent_string(value.
get() ,0);
176MSTL_NODISCARD MSTL_ALWAYS_INLINE_INLINE
string json_value::to_string()
const {
177 return _MSTL to_indent_string(
this);
MSTL_CONSTEXPR20 pointer get() const noexcept
获取原始指针
#define MSTL_ERROR_BUILD_FINAL_CLASS(THIS, BASE, INFO)
构建最终异常类宏
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小