NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
ini_value.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_INI_INI_VALUE_HPP__
2#define NEFORCE_CORE_FILE_INI_INI_VALUE_HPP__
3
10
14NEFORCE_BEGIN_NAMESPACE__
15
21
26struct ini_exception final : value_exception {
27 explicit ini_exception(const char* info = "INI Operation Failed.", const char* type = static_type,
28 const int code = 0) noexcept :
29 value_exception(info, type, code) {}
30
31 explicit ini_exception(const exception& e) :
32 value_exception(e) {}
33
34 ~ini_exception() override = default;
35 static constexpr auto static_type = "ini_exception";
36};
37 // Exceptions
39
45
51
52class ini_value;
53class ini_section;
54class ini_property;
55
56
63class NEFORCE_API ini_value : public istringify<ini_value> {
64public:
73
77 virtual ~ini_value() = default;
78
83 NEFORCE_NODISCARD virtual types type() const noexcept = 0;
84
89 NEFORCE_NODISCARD virtual const ini_section* as_section() const noexcept { return nullptr; }
90
95 NEFORCE_NODISCARD virtual const ini_property* as_property() const noexcept { return nullptr; }
96
101 NEFORCE_NODISCARD bool is_section() const noexcept { return type() == Section; }
102
107 NEFORCE_NODISCARD bool is_property() const noexcept { return type() == Property; }
108
113 NEFORCE_NODISCARD string to_string() const;
114
119 NEFORCE_NODISCARD string to_document() const;
120};
121
122
130class NEFORCE_API ini_property final : public ini_value {
131private:
132 string value_;
133
134public:
139 explicit ini_property(string value) noexcept :
140 value_(_NEFORCE move(value)) {}
141
146 NEFORCE_NODISCARD types type() const noexcept override { return Property; }
147
152 NEFORCE_NODISCARD const ini_property* as_property() const noexcept override { return this; }
153
158 NEFORCE_NODISCARD const string& get_value() const noexcept { return value_; }
159
164 void set_value(string value) noexcept { value_ = _NEFORCE move(value); }
165
171 NEFORCE_NODISCARD int get_int(int default_value = 0) const noexcept;
172
178 NEFORCE_NODISCARD double get_double(double default_value = 0.0) const noexcept;
179
185 NEFORCE_NODISCARD bool get_bool(bool default_value = false) const noexcept;
186};
187
188
196class NEFORCE_API ini_section final : public ini_value {
197private:
199 string name_{};
200
201public:
202 ini_section() = default;
203
208 explicit ini_section(string name) noexcept :
209 name_(_NEFORCE move(name)) {}
210
211 ini_section(const ini_section&) = delete;
212 ini_section& operator=(const ini_section&) = delete;
213
218 ini_section(ini_section&& other) noexcept = default;
219
225 ini_section& operator=(ini_section&& other) noexcept = default;
226
231 NEFORCE_NODISCARD types type() const noexcept override { return Section; }
232
237 NEFORCE_NODISCARD const ini_section* as_section() const noexcept override { return this; }
238
243 NEFORCE_NODISCARD const string& get_name() const noexcept { return name_; }
244
249 void set_name(string name) noexcept { name_ = _NEFORCE move(name); }
250
256 void add_property(const string& key, unique_ptr<ini_property> property) {
257 properties_[key] = _NEFORCE move(property);
258 }
259
265 void set_property(const string& key, string value) { properties_[key] = make_unique<ini_property>(move(value)); }
266
272 NEFORCE_NODISCARD const ini_property* get_property(const string& key) const {
273 const auto it = properties_.find(key);
274 if (it != properties_.end()) {
275 return it->second.get();
276 }
277 return nullptr;
278 }
279
285 NEFORCE_NODISCARD ini_property* get_property(const string& key) {
286 const auto it = properties_.find(key);
287 if (it != properties_.end()) {
288 return it->second.get();
289 }
290 return nullptr;
291 }
292
298 NEFORCE_NODISCARD bool has_property(const string& key) const { return properties_.find(key) != properties_.end(); }
299
304 NEFORCE_NODISCARD const unordered_map<string, unique_ptr<ini_property>>& get_properties() const noexcept {
305 return properties_;
306 }
307
314 NEFORCE_NODISCARD string get_string(const string& key, const string& default_value = "") const {
315 const ini_property* prop = get_property(key);
316 return prop ? prop->get_value() : default_value;
317 }
318
325 NEFORCE_NODISCARD int get_int(const string& key, int default_value = 0) const {
326 const ini_property* prop = get_property(key);
327 return prop ? prop->get_int(default_value) : default_value;
328 }
329
336 NEFORCE_NODISCARD double get_double(const string& key, double default_value = 0.0) const {
337 const ini_property* prop = get_property(key);
338 return prop ? prop->get_double(default_value) : default_value;
339 }
340
347 NEFORCE_NODISCARD bool get_bool(const string& key, bool default_value = false) const {
348 const ini_property* prop = get_property(key);
349 return prop ? prop->get_bool(default_value) : default_value;
350 }
351};
352
353
361class NEFORCE_API ini_document final : public istringify<ini_document> {
362private:
364 unique_ptr<ini_section> global_section_;
365
366public:
373 global_section_(make_unique<ini_section>("")) {}
374
375 ini_document(const ini_document&) = delete;
376 ini_document& operator=(const ini_document&) = delete;
377
382 ini_document(ini_document&& other) noexcept = default;
383
389 ini_document& operator=(ini_document&& other) noexcept = default;
390
398 void add_section(const string& name, unique_ptr<ini_section> section) {
399 if (name.empty()) {
400 global_section_ = _NEFORCE move(section);
401 } else {
402 sections_[name] = _NEFORCE move(section);
403 }
404 }
405
411 NEFORCE_NODISCARD const ini_section* get_section(const string& name) const {
412 if (name.empty()) {
413 return global_section_.get();
414 }
415 const auto it = sections_.find(name);
416 if (it != sections_.end()) {
417 return it->second.get();
418 }
419 return nullptr;
420 }
421
427 NEFORCE_NODISCARD ini_section* get_section(const string& name) {
428 if (name.empty()) {
429 return global_section_.get();
430 }
431 const auto it = sections_.find(name);
432 if (it != sections_.end()) {
433 return it->second.get();
434 }
435 return nullptr;
436 }
437
443 NEFORCE_NODISCARD bool has_section(const string& name) const {
444 if (name.empty()) {
445 return global_section_ != nullptr;
446 }
447 return sections_.find(name) != sections_.end();
448 }
449
454 NEFORCE_NODISCARD const unordered_map<string, unique_ptr<ini_section>>& get_sections() const noexcept {
455 return sections_;
456 }
457
462 NEFORCE_NODISCARD const ini_section* get_global_section() const noexcept { return global_section_.get(); }
463
468 NEFORCE_NODISCARD ini_section* get_global_section() noexcept { return global_section_.get(); }
469
477 NEFORCE_NODISCARD string get_string(const string& section, const string& key,
478 const string& default_value = "") const {
479 const ini_section* sec = get_section(section);
480 return sec ? sec->get_string(key, default_value) : default_value;
481 }
482
490 NEFORCE_NODISCARD int get_int(const string& section, const string& key, int default_value = 0) const {
491 const ini_section* sec = get_section(section);
492 return sec ? sec->get_int(key, default_value) : default_value;
493 }
494
502 NEFORCE_NODISCARD double get_double(const string& section, const string& key, double default_value = 0.0) const {
503 const ini_section* sec = get_section(section);
504 return sec ? sec->get_double(key, default_value) : default_value;
505 }
506
514 NEFORCE_NODISCARD bool get_bool(const string& section, const string& key, bool default_value = false) const {
515 const ini_section* sec = get_section(section);
516 return sec ? sec->get_bool(key, default_value) : default_value;
517 }
518
523 NEFORCE_NODISCARD string to_string() const;
524};
525 // IniConfig
527 // ConfigFormat
529
530NEFORCE_END_NAMESPACE__
531#endif // NEFORCE_CORE_FILE_INI_INI_VALUE_HPP__
NEFORCE_NODISCARD const ini_section * get_section(const string &name) const
获取常量节指针
NEFORCE_NODISCARD ini_section * get_global_section() noexcept
获取全局节的指针
ini_document()
构造函数
NEFORCE_NODISCARD string get_string(const string &section, const string &key, const string &default_value="") const
获取字符串值
NEFORCE_NODISCARD bool has_section(const string &name) const
检查节是否存在
NEFORCE_NODISCARD const unordered_map< string, unique_ptr< ini_section > > & get_sections() const noexcept
获取所有节的常量引用
NEFORCE_NODISCARD int get_int(const string &section, const string &key, int default_value=0) const
获取整数值
NEFORCE_NODISCARD const ini_section * get_global_section() const noexcept
获取全局节的常量指针
NEFORCE_NODISCARD double get_double(const string &section, const string &key, double default_value=0.0) const
获取双精度浮点值
NEFORCE_NODISCARD bool get_bool(const string &section, const string &key, bool default_value=false) const
获取布尔值
NEFORCE_NODISCARD ini_section * get_section(const string &name)
获取节指针
void add_section(const string &name, unique_ptr< ini_section > section)
添加节
NEFORCE_NODISCARD string to_string() const
转换为字符串
ini_document(ini_document &&other) noexcept=default
移动构造函数
ini_document & operator=(ini_document &&other) noexcept=default
移动赋值运算符
NEFORCE_NODISCARD types type() const noexcept override
获取类型
ini_property(string value) noexcept
构造函数
NEFORCE_NODISCARD int get_int(int default_value=0) const noexcept
获取整数值
NEFORCE_NODISCARD const ini_property * as_property() const noexcept override
转换为属性指针
NEFORCE_NODISCARD double get_double(double default_value=0.0) const noexcept
获取双精度浮点值
NEFORCE_NODISCARD const string & get_value() const noexcept
获取属性值
NEFORCE_NODISCARD bool get_bool(bool default_value=false) const noexcept
获取布尔值
void set_value(string value) noexcept
设置属性值
NEFORCE_NODISCARD const ini_section * as_section() const noexcept override
转换为节指针
NEFORCE_NODISCARD const ini_property * get_property(const string &key) const
获取常量属性指针
void set_name(string name) noexcept
设置节名称
NEFORCE_NODISCARD string get_string(const string &key, const string &default_value="") const
获取字符串值
NEFORCE_NODISCARD ini_property * get_property(const string &key)
获取属性指针
ini_section(ini_section &&other) noexcept=default
移动构造函数
NEFORCE_NODISCARD types type() const noexcept override
获取类型
NEFORCE_NODISCARD double get_double(const string &key, double default_value=0.0) const
获取双精度浮点值
ini_section(string name) noexcept
构造函数
NEFORCE_NODISCARD const string & get_name() const noexcept
获取节名称
NEFORCE_NODISCARD int get_int(const string &key, int default_value=0) const
获取整数值
NEFORCE_NODISCARD const unordered_map< string, unique_ptr< ini_property > > & get_properties() const noexcept
获取所有属性的常量引用
ini_section & operator=(ini_section &&other) noexcept=default
移动赋值运算符
NEFORCE_NODISCARD bool get_bool(const string &key, bool default_value=false) const
获取布尔值
NEFORCE_NODISCARD bool has_property(const string &key) const
检查属性是否存在
void add_property(const string &key, unique_ptr< ini_property > property)
添加属性
void set_property(const string &key, string value)
设置属性
ini值抽象基类
NEFORCE_NODISCARD string to_string() const
转换为字符串
NEFORCE_NODISCARD bool is_property() const noexcept
判断是否为属性类型
NEFORCE_NODISCARD string to_document() const
转换为文档字符串
types
ini值类型枚举
@ Property
属性类型
@ Section
节类型
virtual NEFORCE_NODISCARD types type() const noexcept=0
获取ini值类型
virtual ~ini_value()=default
虚析构函数
virtual NEFORCE_NODISCARD const ini_section * as_section() const noexcept
转换为节指针
NEFORCE_NODISCARD bool is_section() const noexcept
判断是否为节类型
virtual NEFORCE_NODISCARD const ini_property * as_property() const noexcept
转换为属性指针
独占智能指针
无序映射容器
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
NEFORCE_ALWAYS_INLINE_INLINE bool name(char *buffer, size_t size)
获取当前线程名称
NEFORCE_CONSTEXPR20 unique_ptr< T > make_unique(Args &&... args)
创建unique_ptr
可字符串化接口
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
NEFORCE_NODISCARD int code() const noexcept
获取异常码
NEFORCE_NODISCARD const char * type() const noexcept
获取异常类型
可字符串化接口
独占智能指针
无序映射容器