NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
toml_builder.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_TOML_BUILDER_HPP__
2#define NEFORCE_CORE_FILE_TOML_BUILDER_HPP__
3
11
15NEFORCE_BEGIN_NAMESPACE__
16
21
26
40class NEFORCE_API toml_builder {
41private:
46 enum range_type {
47 table,
48 inline_table,
49 array
50 };
51
58 struct frame {
59 range_type type = table;
60 union {
61 toml_table* table_ptr = nullptr;
62 toml_array* array_ptr;
63 };
64
65 frame() = default;
66 frame(const range_type t, toml_table* tbl) :
67 type(t),
68 table_ptr(tbl) {}
69 frame(const range_type t, toml_array* arr) :
70 type(t),
71 array_ptr(arr) {}
72
73 frame(const frame&) = default;
74 frame& operator=(const frame&) = default;
75 frame(frame&&) = default;
76 frame& operator=(frame&&) = default;
77 ~frame() = default;
78 };
79
80 stack<frame> contexts_;
82 string current_key_;
83
84private:
96 template <typename T>
97 toml_builder& value_impl(unique_ptr<T> value) {
98 if (contexts_.empty()) {
99 NEFORCE_THROW_EXCEPTION(toml_exception("Cannot add value to root (root must be a table)"));
100 }
101
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 == table || top.type == inline_table) {
106 if (current_key_.empty()) {
107 NEFORCE_THROW_EXCEPTION(toml_exception("No key set for value in table"));
108 }
109 if (top.table_ptr->has_member(current_key_)) {
110 NEFORCE_THROW_EXCEPTION(toml_exception(("Duplicate key: " + current_key_).data()));
111 }
112 top.table_ptr->add_member(current_key_, _NEFORCE move(value));
113 current_key_.clear();
114 }
115 return *this;
116 }
117
124 template <typename Iterable>
125 enable_if_t<is_iterable_v<Iterable>, toml_builder&> value_iterable_dispatch(const Iterable& iterable) {
126 return this->value_iterable_impl(iterable);
127 }
128
135 template <typename Map>
136 enable_if_t<is_maplike_v<Map>, toml_builder&> value_iterable_impl(const Map& maplike) {
138 for (const auto& pair: maplike) {
139 this->key(pair.first).value(pair.second);
140 }
142 return *this;
143 }
144
151 template <typename Iterable>
152 enable_if_t<!is_maplike_v<Iterable>, toml_builder&> value_iterable_impl(const Iterable& iterable) {
153 begin_array();
154 for (const auto& element: iterable) {
155 this->value(element);
156 }
157 end_array();
158 return *this;
159 }
160
169 toml_table* get_or_create_table_path(const vector<string>& path) const;
170
179 toml_array* get_or_create_array_for_array_table(const vector<string>& path) const;
180
181public:
188
189 toml_builder(const toml_builder&) = delete;
190 toml_builder& operator=(const toml_builder&) = delete;
191
196 toml_builder(toml_builder&& other) = default;
197
204
212
220
230
237
246
253
262
269
279
289
297
304 toml_builder& value(nullptr_t np) { return value_impl(make_unique<toml_boolean>(false)); }
305
312 toml_builder& value(const bool value) { return value_impl(make_unique<toml_boolean>(value)); }
313
321
328 toml_builder& value(const int value) { return this->value(static_cast<int64_t>(value)); }
329
336 toml_builder& value(const double value) { return value_impl(make_unique<toml_float>(value)); }
337
345 return value_impl(make_unique<toml_string>(_NEFORCE move(value), toml_string::Basic));
346 }
347
354 toml_builder& value(const char* value) { return this->value(string(value)); }
355
362 toml_builder& value(const string_view value) { return this->value(string(value)); }
363
370 toml_builder& value(unique_ptr<toml_value> value) { return value_impl(_NEFORCE move(value)); }
371
380 return value_impl(make_unique<toml_string>(_NEFORCE move(value), type));
381 }
382
393
404 template <typename Iterable>
405 toml_builder& value(const Iterable& iterable) {
406 return this->value_iterable_dispatch(iterable);
407 }
408
417 toml_builder& value_table(const function<void(toml_builder&)>& build_func);
418
427
435 toml_builder& value_array(const function<void(toml_builder&)>& build_func);
436
446};
447 // TomlConfig
449 // ConfigFormat
451
452NEFORCE_END_NAMESPACE__
453#endif // NEFORCE_CORE_FILE_TOML_BUILDER_HPP__
函数包装器主模板声明
文件路径类
栈容器适配器
toml数组类
toml_builder & end_table()
结束当前标准表格
toml_builder & value(const char *value)
设置C字符串值
toml_builder & value(nullptr_t np)
设置null值
toml_builder & value_table(const function< void(toml_builder &)> &build_func)
使用函数式方式构建表格值
toml_builder & value(const int value)
设置整数值
toml_builder & end_array_table()
结束当前表格数组
unique_ptr< toml_table > build()
构建toml文档
toml_builder & value(unique_ptr< toml_value > value)
设置已构建的toml值
toml_builder & begin_inline_table()
开始一个内联表格
toml_builder()
构造函数
toml_builder & value(const bool value)
设置布尔值
toml_builder & begin_array()
开始一个数组
toml_builder & end_inline_table()
结束当前内联表格
toml_builder & end_array()
结束当前数组
toml_builder & begin_table(const string &name)
开始一个标准表格(单键版本)
toml_builder & value(const int64_t value)
设置64位整数值
toml_builder & value(const Iterable &iterable)
设置可迭代对象的值
toml_builder & operator=(toml_builder &&other)=default
移动赋值运算符
toml_builder & value_array(const function< void(toml_builder &)> &build_func)
使用函数式方式构建数组值
toml_builder & begin_array_table(const string &name)
开始一个表格数组(单键版本)
toml_builder & value_datetime(const string_view value, toml_datetime::datetime_type type)
设置指定类型的日期时间值
toml_builder & value_string(string value, toml_string::string_type type)
设置指定类型的字符串值
toml_builder(toml_builder &&other)=default
移动构造函数
toml_builder & value(const double value)
设置双精度浮点数值
toml_builder & value_inline_table(const function< void(toml_builder &)> &build_func)
使用函数式方式构建内联表格值
toml_builder & value(const string_view value)
设置字符串视图值
toml_builder & begin_array_table(const vector< string > &path)
开始一个表格数组(路径版本)
toml_builder & key(string key)
设置当前键名
toml_builder & value(string value)
设置字符串值(基本字符串类型)
toml_builder & begin_table(const vector< string > &path)
开始一个标准表格(路径版本)
datetime_type
日期时间类型枚举
string_type
字符串引号类型枚举
@ Basic
基本字符串 "string"
toml表格类
独占智能指针
动态大小数组容器
通用函数包装器
long long int64_t
64位有符号整数类型
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
字符字符串视图
NEFORCE_ALWAYS_INLINE_INLINE bool name(char *buffer, size_t size)
获取当前线程名称
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
栈容器适配器
存储两个值的元组对
T2 second
第二个元素
T1 first
第一个元素
toml格式操作失败
TOML配置格式变量