NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
json_builder.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_JSON_JSON_BUILDER_HPP__
2#define NEFORCE_CORE_FILE_JSON_JSON_BUILDER_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
21
26
38class NEFORCE_API json_builder {
39private:
44 enum range_type {
45 object,
46 array
47 };
48
55 struct frame {
56 range_type type = object;
57 union {
58 json_object* object_ptr = nullptr;
59 json_array* array_ptr;
60 };
61
62 frame() = default;
63 frame(const range_type t, json_object* obj) :
64 type(t),
65 object_ptr(obj) {}
66 frame(const range_type t, json_array* arr) :
67 type(t),
68 array_ptr(arr) {}
69
70 frame(const frame&) = default;
71 frame& operator=(const frame&) = default;
72 frame(frame&&) = default;
73 frame& operator=(frame&&) = default;
74 ~frame() = default;
75 };
76
77 stack<frame> contexts_;
79 string current_key_;
80
81private:
94 template <typename T>
95 json_builder& value_impl(unique_ptr<T> value) {
96 if (contexts_.empty()) {
97 if (root_) {
98 NEFORCE_THROW_EXCEPTION(json_exception("Multiple root values not allowed"));
99 }
100 root_ = _NEFORCE move(value);
101 } else {
102 const auto& top = contexts_.top();
103 if (top.type == array) {
104 top.array_ptr->add_element(_NEFORCE move(value));
105 } else if (top.type == object) {
106 if (current_key_.empty()) {
107 NEFORCE_THROW_EXCEPTION(json_exception("No key set for value in object"));
108 }
109 top.object_ptr->add_member(current_key_, _NEFORCE move(value));
110 current_key_.clear();
111 }
112 }
113 return *this;
114 }
115
122 template <typename Iterable>
123 enable_if_t<is_iterable_v<Iterable>, json_builder&> value_iterable_dispatch(const Iterable& iterable) {
124 return this->value_iterable_impl(iterable);
125 }
126
133 template <typename Map>
134 enable_if_t<is_maplike_v<Map>, json_builder&> value_iterable_impl(const Map& maplike) {
135 begin_object();
136 for (const auto& pair: maplike) {
137 this->key(pair.first).value(pair.second);
138 }
139 end_object();
140 return *this;
141 }
142
149 template <typename Iterable>
150 enable_if_t<!is_maplike_v<Iterable>, json_builder&> value_iterable_impl(const Iterable& iterable) {
151 begin_array();
152 for (const auto& element: iterable) {
153 this->value(element);
154 }
155 end_array();
156 return *this;
157 }
158
159public:
163 json_builder() = default;
164
165 json_builder(const json_builder&) = delete;
166 json_builder& operator=(const json_builder&) = delete;
167
172 json_builder(json_builder&& other) = default;
173
180
191
202
212
222
231 json_builder& key(const string& key);
232
239 json_builder& value(nullptr_t np) { return value_impl(make_unique<json_null>()); }
240
247 json_builder& value(const string& value) { return value_impl(make_unique<json_string>(value)); }
248
255 json_builder& value(const char* value) { return this->value(string(value)); }
256
263 json_builder& value(const string_view value) { return this->value(string(value)); }
264
271 json_builder& value(const double value) { return value_impl(make_unique<json_number>(value)); }
272
279 json_builder& value(const int value) { return value_impl(make_unique<json_number>(static_cast<double>(value))); }
280
287 json_builder& value(const bool value) { return value_impl(make_unique<json_bool>(value)); }
288
295 json_builder& value(unique_ptr<json_value>&& value) { return value_impl(_NEFORCE move(value)); }
296
307 template <typename Iterable>
308 json_builder& value(const Iterable& iterable) {
309 return this->value_iterable_dispatch(iterable);
310 }
311
319 json_builder& value_object(const function<void(json_builder&)>& build_func);
320
328 json_builder& value_array(const function<void(json_builder&)>& build_func);
329
339};
340 // JsonConfig
342 // ConfigFormat
344
345NEFORCE_END_NAMESPACE__
346#endif // NEFORCE_CORE_FILE_JSON_JSON_BUILDER_HPP__
函数包装器主模板声明
json数组类
json_builder & end_object()
结束当前json对象
json_builder & value(nullptr_t np)
设置null值
json_builder & value(const string &value)
设置字符串值
json_builder & value(const string_view value)
设置字符串视图值
json_builder()=default
默认构造函数
json_builder & value(const double value)
设置双精度浮点数值
json_builder & value(const char *value)
设置C字符串值
json_builder & value(const bool value)
设置布尔值
json_builder & key(const string &key)
设置当前对象的键名
json_builder & value_array(const function< void(json_builder &)> &build_func)
使用函数式方式构建数组值
json_builder & value(unique_ptr< json_value > &&value)
设置已构建的json值
json_builder & value(const int value)
设置整数值
json_builder & operator=(json_builder &&other)=default
移动赋值运算符
json_builder & begin_object()
开始一个json对象
json_builder & end_array()
结束当前json数组
json_builder & value_object(const function< void(json_builder &)> &build_func)
使用函数式方式构建对象值
json_builder(json_builder &&other)=default
移动构造函数
json_builder & begin_array()
开始一个json数组
json_builder & value(const Iterable &iterable)
设置可迭代对象的值
unique_ptr< json_value > build()
构建json文档
json对象类
栈容器适配器
独占智能指针
通用函数包装器
decltype(nullptr) nullptr_t
空指针类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
JSON配置格式变量
栈容器适配器
json格式操作失败
存储两个值的元组对
T2 second
第二个元素
T1 first
第一个元素