1#ifndef NEFORCE_CORE_FILE_INI_INI_VALUE_HPP__
2#define NEFORCE_CORE_FILE_INI_INI_VALUE_HPP__
14NEFORCE_BEGIN_NAMESPACE__
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 :
31 explicit ini_exception(
const exception& e) :
34 ~ini_exception()
override =
default;
35 static constexpr auto static_type =
"ini_exception";
83 NEFORCE_NODISCARD
virtual types type() const noexcept = 0;
140 value_(_NEFORCE
move(value)) {}
158 NEFORCE_NODISCARD
const string&
get_value() const noexcept {
return value_; }
171 NEFORCE_NODISCARD
int get_int(
int default_value = 0) const noexcept;
178 NEFORCE_NODISCARD
double get_double(
double default_value = 0.0) const noexcept;
185 NEFORCE_NODISCARD
bool get_bool(
bool default_value = false) const noexcept;
202 ini_section() =
default;
225 ini_section&
operator=(ini_section&& other)
noexcept =
default;
237 NEFORCE_NODISCARD
const ini_section*
as_section() const noexcept
override {
return this; }
243 NEFORCE_NODISCARD
const string&
get_name() const noexcept {
return name_; }
257 properties_[key] = _NEFORCE
move(property);
273 const auto it = properties_.find(key);
274 if (it != properties_.end()) {
275 return it->second.get();
286 const auto it = properties_.find(key);
287 if (it != properties_.end()) {
288 return it->second.get();
298 NEFORCE_NODISCARD
bool has_property(
const string& key)
const {
return properties_.find(key) != properties_.end(); }
314 NEFORCE_NODISCARD
string get_string(
const string& key,
const string& default_value =
"")
const {
316 return prop ? prop->
get_value() : default_value;
325 NEFORCE_NODISCARD
int get_int(
const string& key,
int default_value = 0)
const {
327 return prop ? prop->
get_int(default_value) : default_value;
336 NEFORCE_NODISCARD
double get_double(
const string& key,
double default_value = 0.0)
const {
338 return prop ? prop->
get_double(default_value) : default_value;
347 NEFORCE_NODISCARD
bool get_bool(
const string& key,
bool default_value =
false)
const {
349 return prop ? prop->
get_bool(default_value) : default_value;
400 global_section_ = _NEFORCE
move(section);
402 sections_[
name] = _NEFORCE
move(section);
413 return global_section_.get();
415 const auto it = sections_.find(
name);
416 if (it != sections_.end()) {
417 return it->second.get();
429 return global_section_.get();
431 const auto it = sections_.find(
name);
432 if (it != sections_.end()) {
433 return it->second.get();
445 return global_section_ !=
nullptr;
447 return sections_.find(
name) != sections_.end();
477 NEFORCE_NODISCARD
string get_string(
const string& section,
const string& key,
478 const string& default_value =
"")
const {
480 return sec ? sec->
get_string(key, default_value) : default_value;
490 NEFORCE_NODISCARD
int get_int(
const string& section,
const string& key,
int default_value = 0)
const {
492 return sec ? sec->
get_int(key, default_value) : default_value;
502 NEFORCE_NODISCARD
double get_double(
const string& section,
const string& key,
double default_value = 0.0)
const {
504 return sec ? sec->
get_double(key, default_value) : default_value;
514 NEFORCE_NODISCARD
bool get_bool(
const string& section,
const string& key,
bool default_value =
false)
const {
516 return sec ? sec->
get_bool(key, default_value) : default_value;
530NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD const ini_section * get_section(const string &name) const
获取常量节指针
NEFORCE_NODISCARD ini_section * get_global_section() noexcept
获取全局节的指针
NEFORCE_NODISCARD string get_string(const string §ion, 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 §ion, 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 §ion, const string &key, double default_value=0.0) const
获取双精度浮点值
NEFORCE_NODISCARD bool get_bool(const string §ion, 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)
设置属性
NEFORCE_NODISCARD string to_string() const
转换为字符串
NEFORCE_NODISCARD bool is_property() const noexcept
判断是否为属性类型
NEFORCE_NODISCARD string to_document() const
转换为文档字符串
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
获取异常类型