NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
yaml_builder.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_YAML_YAML_BUILDER_HPP__
2#define NEFORCE_CORE_FILE_YAML_YAML_BUILDER_HPP__
3
12
16NEFORCE_BEGIN_NAMESPACE__
17
22
27
44class NEFORCE_API yaml_builder {
45private:
52 struct frame {
53 enum context_type {
54 mapping,
55 sequence
56 };
57
58 context_type type = mapping;
59 union {
60 yaml_mapping* map_ptr = nullptr;
61 yaml_sequence* seq_ptr;
62 };
63
64 frame() = default;
65 frame(const context_type t, yaml_mapping* m) :
66 type(t),
67 map_ptr(m) {}
68 frame(const context_type t, yaml_sequence* s) :
69 type(t),
70 seq_ptr(s) {}
71
72 frame(const frame&) = default;
73 frame& operator=(const frame&) = default;
74 frame(frame&&) = default;
75 frame& operator=(frame&&) = default;
76 ~frame() = default;
77 };
78
79 stack<frame> contexts_;
81 string current_key_;
82 string pending_anchor_;
83 string pending_tag_;
86
91 void apply_pending_metadata(const shared_ptr<yaml_value>& value);
92
100 template <typename T>
101 yaml_builder& value_impl(shared_ptr<T> value) {
102 apply_pending_metadata(value);
103
104 if (contexts_.empty()) {
105 NEFORCE_THROW_EXCEPTION(yaml_exception("Cannot add value: no active context"));
106 }
107
108 const auto& top = contexts_.top();
109 if (top.type == frame::sequence) {
110 top.seq_ptr->add_element(value);
111 } else if (top.type == frame::mapping) {
112 if (current_key_.empty()) {
113 NEFORCE_THROW_EXCEPTION(yaml_exception("No key set for value in mapping"));
114 }
115 if (top.map_ptr->has_member(current_key_)) {
116 NEFORCE_THROW_EXCEPTION(yaml_exception(("Duplicate key: " + current_key_).data()));
117 }
118 top.map_ptr->add_member(current_key_, value);
119 current_key_.clear();
120 }
121 return *this;
122 }
123
124 template <typename Iterable>
125 enable_if_t<is_maplike_v<Iterable>> value_iterable_impl(const Iterable& iterable) {
127 for (const auto& pair: iterable) {
128 this->key(pair.first).value(pair.second);
129 }
130 end_mapping();
131 return;
132 }
133
134 template <typename Iterable>
135 enable_if_t<!is_maplike_v<Iterable>> value_iterable_impl(const Iterable& iterable) {
137 for (const auto& element: iterable) {
138 this->value(element);
139 }
140 end_sequence();
141 return;
142 }
143
147 void add_to_parent_and_push(const shared_ptr<yaml_value>& container, frame f);
148
149public:
156
157 yaml_builder(const yaml_builder&) = delete;
158 yaml_builder& operator=(const yaml_builder&) = delete;
159
163 yaml_builder(yaml_builder&& other) = default;
164
169
177
184
190
196
203
210
216
222
229
235 yaml_builder& value(nullptr_t np) { return value_impl(make_shared<yaml_null>()); }
236
242 yaml_builder& value(const bool v) { return value_impl(make_shared<yaml_boolean>(v)); }
243
249 yaml_builder& value(const int64_t v) { return value_impl(make_shared<yaml_integer>(v)); }
250
256 yaml_builder& value(const int v) { return value_impl(make_shared<yaml_integer>(static_cast<int64_t>(v))); }
257
263 yaml_builder& value(const double v) { return value_impl(make_shared<yaml_float>(v)); }
264
270 yaml_builder& value(string v) { return value_impl(make_shared<yaml_string>(_NEFORCE move(v), yaml_string::Plain)); }
271
277 yaml_builder& value(const char* v) { return this->value(string(v)); }
278
284 yaml_builder& value(const string_view v) { return this->value(string(v)); }
285
291 yaml_builder& value(shared_ptr<yaml_value> v) { return value_impl(_NEFORCE move(v)); }
292
299
307
318 template <typename Iterable, enable_if_t<is_iterable_v<Iterable>, int> = 0>
319 yaml_builder& value_iterable(const Iterable& iterable) {
320 value_iterable_impl(iterable);
321 return *this;
322 }
323
329 yaml_builder& value_mapping(const function<void(yaml_builder&)>& build_func);
330
337
344
351
358
365
374
382 yaml_builder& tag(string t);
383
392 yaml_builder& alias(const string& name);
393
401
408
415};
416 // YamlConfig
418 // ConfigFormat
420
421NEFORCE_END_NAMESPACE__
422#endif // NEFORCE_CORE_FILE_YAML_YAML_BUILDER_HPP__
日期时间类
函数包装器主模板声明
共享智能指针类模板
栈容器适配器
无序映射容器
动态大小数组容器
yaml_builder & value(const double v)
设置双精度浮点数值
yaml_builder & begin_flow_mapping()
开始一个流样式映射
yaml_builder & value_block_sequence(const function< void(yaml_builder &)> &build_func)
使用函数式方式构建块样式序列值
yaml_builder & begin_flow_sequence()
开始一个流样式序列
yaml_builder & begin_block_mapping()
开始一个块样式映射
yaml_builder & begin_sequence()
开始一个序列(块样式)
vector< shared_ptr< yaml_value > > build_documents()
构建多文档YAML文档树
shared_ptr< yaml_value > build()
构建YAML文档树
yaml_builder & tag(string t)
为下一个值设置标签
yaml_builder & value(const char *v)
设置C字符串值
yaml_builder & value_datetime(const datetime &dt)
设置时间戳值
yaml_builder & value(nullptr_t np)
设置null值
yaml_builder & alias(const string &name)
添加一个别名引用
yaml_builder & value_block_mapping(const function< void(yaml_builder &)> &build_func)
使用函数式方式构建块样式映射值
yaml_builder & key(string key)
设置当前键名
yaml_builder & value(const int64_t v)
设置64位整数值
yaml_builder & operator=(yaml_builder &&other)=default
移动赋值运算符
yaml_builder & value(const int v)
设置整数值
yaml_builder & value_flow_sequence(const function< void(yaml_builder &)> &build_func)
使用函数式方式构建流样式序列值
yaml_builder & begin_block_sequence()
开始一个块样式序列
yaml_builder & begin_mapping()
开始一个映射(块样式)
yaml_builder & end_mapping()
结束当前映射
yaml_builder & begin_document()
开始新文档(多文档模式)
yaml_builder & end_sequence()
结束当前序列
yaml_builder & value(string v)
设置字符串值(纯文本样式)
yaml_builder & value_string(string v, yaml_string::string_style style)
设置指定类型的字符串值
yaml_builder & anchor(string name)
为下一个值设置锚点
yaml_builder & value_mapping(const function< void(yaml_builder &)> &build_func)
使用函数式方式构建映射值
yaml_builder & value(const string_view v)
设置字符串视图值
yaml_builder(yaml_builder &&other)=default
移动构造函数
yaml_builder & value(shared_ptr< yaml_value > v)
设置已构建的YAML值
yaml_builder & value_iterable(const Iterable &iterable)
设置可迭代对象的值
yaml_builder & value(const bool v)
设置布尔值
yaml_builder & value_sequence(const function< void(yaml_builder &)> &build_func)
使用函数式方式构建序列值
yaml_builder()
构造函数
yaml_builder & value_flow_mapping(const function< void(yaml_builder &)> &build_func)
使用函数式方式构建流样式映射值
YAML映射值类型(字典/对象)
YAML序列值类型(数组)
string_style
字符串标量样式枚举
@ Plain
纯文本样式(无引号)
通用函数包装器
long long int64_t
64位有符号整数类型
decltype(nullptr) nullptr_t
空指针类型
enable_if_t<!is_unbounded_array_v< T > &&is_constructible_v< T, Args... >, shared_ptr< T > > make_shared(Args &&... args)
融合分配创建共享指针
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
bool name(char *buffer, size_t size)
获取当前线程名称
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
栈容器适配器
存储两个值的元组对
T2 second
第二个元素
T1 first
第一个元素
YAML格式操作失败
YAML配置格式变量