NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
toml_value.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_TOML_TOML_VALUE_HPP__
2#define NEFORCE_CORE_FILE_TOML_TOML_VALUE_HPP__
3
10
15NEFORCE_BEGIN_NAMESPACE__
16
22
27struct toml_exception final : value_exception {
28 explicit toml_exception(const char* info = "TOML Operation Failed.", const char* type = static_type,
29 const int code = 0) noexcept :
30 value_exception(info, type, code) {}
31
32 explicit toml_exception(const exception& e) :
33 value_exception(e) {}
34
35 ~toml_exception() override = default;
36 static constexpr auto static_type = "toml_exception";
37};
38 // Exceptions
40
46
155
156class toml_value;
157class toml_boolean;
158class toml_integer;
159class toml_float;
160class toml_string;
161class toml_datetime;
162class toml_array;
163class toml_table;
164
165
172class NEFORCE_API toml_value : public istringify<toml_value> {
173public:
187
191 virtual ~toml_value() = default;
192
197 NEFORCE_NODISCARD virtual types type() const noexcept = 0;
198
203 NEFORCE_NODISCARD virtual const toml_boolean* as_boolean() const noexcept { return nullptr; }
204
209 NEFORCE_NODISCARD virtual const toml_integer* as_integer() const noexcept { return nullptr; }
210
215 NEFORCE_NODISCARD virtual const toml_float* as_float() const noexcept { return nullptr; }
216
221 NEFORCE_NODISCARD virtual const toml_string* as_string() const noexcept { return nullptr; }
222
227 NEFORCE_NODISCARD virtual const toml_datetime* as_datetime() const noexcept { return nullptr; }
228
233 NEFORCE_NODISCARD virtual const toml_array* as_array() const noexcept { return nullptr; }
234
239 NEFORCE_NODISCARD virtual const toml_table* as_table() const noexcept { return nullptr; }
240
245 NEFORCE_NODISCARD bool is_boolean() const noexcept { return type() == Boolean; }
246
251 NEFORCE_NODISCARD bool is_integer() const noexcept { return type() == Integer; }
252
257 NEFORCE_NODISCARD bool is_float() const noexcept { return type() == Float; }
258
263 NEFORCE_NODISCARD bool is_string() const noexcept { return type() == String; }
264
269 NEFORCE_NODISCARD bool is_datetime() const noexcept { return type() == DateTime; }
270
275 NEFORCE_NODISCARD bool is_array() const noexcept { return type() == Array; }
276
281 NEFORCE_NODISCARD bool is_table() const noexcept { return type() == Table; }
282
287 NEFORCE_NODISCARD string to_string() const;
288
293 NEFORCE_NODISCARD string to_document() const;
294};
295
296
303class NEFORCE_API toml_boolean final : public toml_value {
304private:
305 bool value_;
306
307public:
312 explicit toml_boolean(const bool value) noexcept :
313 value_(value) {}
314
319 NEFORCE_NODISCARD types type() const noexcept override { return Boolean; }
320
325 NEFORCE_NODISCARD const toml_boolean* as_boolean() const noexcept override { return this; }
326
331 NEFORCE_NODISCARD bool get_value() const noexcept { return value_; }
332};
333
340class NEFORCE_API toml_integer final : public toml_value {
341private:
342 int64_t value_;
343
344public:
349 explicit toml_integer(const int64_t value) noexcept :
350 value_(value) {}
351
356 NEFORCE_NODISCARD types type() const noexcept override { return Integer; }
357
362 NEFORCE_NODISCARD const toml_integer* as_integer() const noexcept override { return this; }
363
368 NEFORCE_NODISCARD int64_t get_value() const noexcept { return value_; }
369};
370
377class NEFORCE_API toml_float final : public toml_value {
378private:
379 double value_;
380
381public:
386 explicit toml_float(const double value) noexcept :
387 value_(value) {}
388
393 NEFORCE_NODISCARD types type() const noexcept override { return Float; }
394
399 NEFORCE_NODISCARD const toml_float* as_float() const noexcept override { return this; }
400
405 NEFORCE_NODISCARD double get_value() const noexcept { return value_; }
406};
407
418class NEFORCE_API toml_string final : public toml_value {
419public:
430
431private:
432 string value_;
433 string_type type_;
434
435public:
441 explicit toml_string(string value, const string_type type = Basic) noexcept :
442 value_(_NEFORCE move(value)),
443 type_(type) {}
444
449 NEFORCE_NODISCARD types type() const noexcept override { return String; }
450
455 NEFORCE_NODISCARD const toml_string* as_string() const noexcept override { return this; }
456
461 NEFORCE_NODISCARD const string& get_value() const noexcept { return value_; }
462
467 NEFORCE_NODISCARD string_type get_string_type() const noexcept { return type_; }
468};
469
480class NEFORCE_API toml_datetime final : public toml_value {
481public:
492
493private:
494 datetime value_;
495 datetime_type type_;
496
497public:
505 explicit toml_datetime(const string_view value, const datetime_type type) noexcept :
506 type_(type) {
507 switch (type_) {
509 datetime dt;
510 dt.try_parse_ISO_UTC(value);
511 value_ = dt;
512 break;
513 }
515 datetime dt;
516 dt.try_parse_ISO(value);
517 value_ = dt;
518 break;
519 }
521 date d{};
522 d.try_parse(value);
523 value_ = d;
524 break;
525 }
527 time t{};
528 t.try_parse(value);
529 value_ = t;
530 break;
531 }
532 default: {
533 unreachable();
534 }
535 }
536 }
537
542 NEFORCE_NODISCARD types type() const noexcept override { return DateTime; }
543
548 NEFORCE_NODISCARD const toml_datetime* as_datetime() const noexcept override { return this; }
549
554 NEFORCE_NODISCARD const datetime& get_value() const noexcept { return value_; }
555
560 NEFORCE_NODISCARD string get_string_value() const noexcept {
561 switch (type_) {
563 return value_.to_string_ISO_UTC();
564 }
566 return value_.to_string_ISO();
567 }
569 return value_.date().to_string();
570 }
572 return value_.time().to_string();
573 }
574 default: {
575 unreachable();
576 }
577 }
578 }
579
584 NEFORCE_NODISCARD datetime_type get_datetime_type() const noexcept { return type_; }
585};
586
594class NEFORCE_API toml_array final : public toml_value {
595private:
597
598public:
602 toml_array() = default;
603
604 toml_array(const toml_array&) = delete;
605 toml_array& operator=(const toml_array&) = delete;
606
611 toml_array(toml_array&& other) = default;
612
618 toml_array& operator=(toml_array&& other) = default;
619
624 NEFORCE_NODISCARD types type() const noexcept override { return Array; }
625
630 NEFORCE_NODISCARD const toml_array* as_array() const noexcept override { return this; }
631
636 void add_element(unique_ptr<toml_value> value) { elements_.emplace_back(_NEFORCE move(value)); }
637
643 NEFORCE_NODISCARD const toml_value* get_element(const size_t index) const noexcept {
644 if (index < elements_.size()) {
645 return elements_[index].get();
646 }
647 return nullptr;
648 }
649
654 NEFORCE_NODISCARD size_t size() const noexcept { return elements_.size(); }
655
660 NEFORCE_NODISCARD const vector<unique_ptr<toml_value>>& get_elements() const noexcept { return elements_; }
661};
662
670class NEFORCE_API toml_table final : public toml_value {
671private:
673 bool is_inline_ = false;
674
675public:
679 toml_table() = default;
680
685 explicit toml_table(const bool is_inline) :
686 is_inline_(is_inline) {}
687
688 toml_table(const toml_table&) = delete;
689 toml_table& operator=(const toml_table&) = delete;
690
695 toml_table(toml_table&& other) = default;
696
702 toml_table& operator=(toml_table&& other) = default;
703
708 NEFORCE_NODISCARD types type() const noexcept override { return Table; }
709
714 NEFORCE_NODISCARD const toml_table* as_table() const noexcept override { return this; }
715
721 void add_member(const string& key, unique_ptr<toml_value> value) { members_[key] = _NEFORCE move(value); }
722
728 NEFORCE_NODISCARD const toml_value* get_member(const string& key) const {
729 const auto it = members_.find(key);
730 if (it != members_.end()) {
731 return it->second.get();
732 }
733 return nullptr;
734 }
735
741 NEFORCE_NODISCARD toml_value* get_member(const string& key) {
742 const auto it = members_.find(key);
743 if (it != members_.end()) {
744 return it->second.get();
745 }
746 return nullptr;
747 }
748
754 NEFORCE_NODISCARD bool has_member(const string& key) const { return members_.find(key) != members_.end(); }
755
760 NEFORCE_NODISCARD const unordered_map<string, unique_ptr<toml_value>>& get_members() const noexcept {
761 return members_;
762 }
763
768 NEFORCE_NODISCARD bool is_inline() const noexcept { return is_inline_; }
769
774 void set_inline(const bool is_inline) noexcept { is_inline_ = is_inline; }
775};
776 // TomlConfig
778 // ConfigFormat
780
781NEFORCE_END_NAMESPACE__
782#endif // NEFORCE_CORE_FILE_TOML_TOML_VALUE_HPP__
日期类
日期时间类
NEFORCE_CONSTEXPR20 bool try_parse_ISO_UTC(const string_view view) noexcept
尝试解析ISO格式带时区
NEFORCE_CONSTEXPR20 bool try_parse_ISO(const string_view view) noexcept
尝试解析ISO格式(无时区)
时间类
toml数组类
NEFORCE_NODISCARD size_t size() const noexcept
获取数组大小
NEFORCE_NODISCARD const toml_array * as_array() const noexcept override
转换为数组指针
toml_array()=default
默认构造函数
NEFORCE_NODISCARD const vector< unique_ptr< toml_value > > & get_elements() const noexcept
获取所有元素的常量引用
void add_element(unique_ptr< toml_value > value)
添加元素
toml_array & operator=(toml_array &&other)=default
移动赋值运算符
toml_array(toml_array &&other)=default
移动构造函数
NEFORCE_NODISCARD types type() const noexcept override
获取类型
NEFORCE_NODISCARD const toml_value * get_element(const size_t index) const noexcept
获取常量元素指针
toml布尔值类
NEFORCE_NODISCARD types type() const noexcept override
获取类型
NEFORCE_NODISCARD const toml_boolean * as_boolean() const noexcept override
转换为布尔值指针
NEFORCE_NODISCARD bool get_value() const noexcept
获取布尔值
toml_boolean(const bool value) noexcept
构造函数
toml日期时间值类
NEFORCE_NODISCARD types type() const noexcept override
获取类型
NEFORCE_NODISCARD const toml_datetime * as_datetime() const noexcept override
转换为日期时间指针
NEFORCE_NODISCARD const datetime & get_value() const noexcept
获取日期时间值
toml_datetime(const string_view value, const datetime_type type) noexcept
构造函数
NEFORCE_NODISCARD datetime_type get_datetime_type() const noexcept
获取日期时间类型
NEFORCE_NODISCARD string get_string_value() const noexcept
获取字符串格式的日期时间值
datetime_type
日期时间类型枚举
@ LocalTime
本地时间 07:32:00
@ LocalDate
本地日期 1979-05-27
@ OffsetDateTime
偏移日期时间 1979-05-27T07:32:00Z
@ LocalDateTime
本地日期时间 1979-05-27T07:32:00
toml浮点数值类
NEFORCE_NODISCARD double get_value() const noexcept
获取浮点数值
NEFORCE_NODISCARD const toml_float * as_float() const noexcept override
转换为浮点数指针
NEFORCE_NODISCARD types type() const noexcept override
获取类型
toml_float(const double value) noexcept
构造函数
toml整数值类
NEFORCE_NODISCARD types type() const noexcept override
获取类型
NEFORCE_NODISCARD int64_t get_value() const noexcept
获取整数值
toml_integer(const int64_t value) noexcept
构造函数
NEFORCE_NODISCARD const toml_integer * as_integer() const noexcept override
转换为整数指针
toml字符串值类
NEFORCE_NODISCARD const toml_string * as_string() const noexcept override
转换为字符串指针
toml_string(string value, const string_type type=Basic) noexcept
构造函数
NEFORCE_NODISCARD string_type get_string_type() const noexcept
获取字符串引号类型
NEFORCE_NODISCARD const string & get_value() const noexcept
获取字符串值
string_type
字符串引号类型枚举
@ MultiBasic
多行基本字符串 """string"""
@ MultiLiteral
多行字面量字符串 '''string'''
@ Basic
基本字符串 "string"
@ Literal
字面量字符串 'string'
NEFORCE_NODISCARD types type() const noexcept override
获取类型
toml表格类
toml_table & operator=(toml_table &&other)=default
移动赋值运算符
NEFORCE_NODISCARD bool has_member(const string &key) const
检查成员是否存在
void set_inline(const bool is_inline) noexcept
设置内联表格标记
toml_table()=default
默认构造函数
NEFORCE_NODISCARD const toml_value * get_member(const string &key) const
获取常量成员指针
NEFORCE_NODISCARD bool is_inline() const noexcept
判断是否为内联表格
NEFORCE_NODISCARD const toml_table * as_table() const noexcept override
转换为表格指针
NEFORCE_NODISCARD const unordered_map< string, unique_ptr< toml_value > > & get_members() const noexcept
获取所有成员的常量引用
NEFORCE_NODISCARD types type() const noexcept override
获取类型
toml_table(const bool is_inline)
构造函数
void add_member(const string &key, unique_ptr< toml_value > value)
添加成员
toml_table(toml_table &&other)=default
移动构造函数
NEFORCE_NODISCARD toml_value * get_member(const string &key)
获取成员指针
toml值抽象基类
NEFORCE_NODISCARD bool is_datetime() const noexcept
判断是否为日期时间类型
NEFORCE_NODISCARD bool is_float() const noexcept
判断是否为浮点数类型
NEFORCE_NODISCARD bool is_integer() const noexcept
判断是否为整数类型
virtual NEFORCE_NODISCARD types type() const noexcept=0
获取toml值类型
virtual NEFORCE_NODISCARD const toml_table * as_table() const noexcept
转换为表格指针
virtual ~toml_value()=default
虚析构函数
types
toml值类型枚举
@ Table
表格类型
@ String
字符串类型
@ Array
数组类型
@ Boolean
布尔值类型
@ DateTime
日期时间类型
@ Integer
整数类型
@ Float
浮点数类型
NEFORCE_NODISCARD bool is_array() const noexcept
判断是否为数组类型
NEFORCE_NODISCARD string to_document() const
转换为文档格式字符串
virtual NEFORCE_NODISCARD const toml_boolean * as_boolean() const noexcept
转换为布尔值指针
NEFORCE_NODISCARD bool is_boolean() const noexcept
判断是否为布尔类型
virtual NEFORCE_NODISCARD const toml_float * as_float() const noexcept
转换为浮点数指针
virtual NEFORCE_NODISCARD const toml_datetime * as_datetime() const noexcept
转换为日期时间指针
virtual NEFORCE_NODISCARD const toml_string * as_string() const noexcept
转换为字符串指针
NEFORCE_NODISCARD string to_string() const
转换为紧凑格式字符串
NEFORCE_NODISCARD bool is_string() const noexcept
判断是否为字符串类型
virtual NEFORCE_NODISCARD const toml_integer * as_integer() const noexcept
转换为整数指针
virtual NEFORCE_NODISCARD const toml_array * as_array() const noexcept
转换为数组指针
NEFORCE_NODISCARD bool is_table() const noexcept
判断是否为表格类型
独占智能指针
无序映射容器
动态大小数组容器
日期时间处理库
long long int64_t
64位有符号整数类型
NEFORCE_NORETURN NEFORCE_ALWAYS_INLINE_INLINE void unreachable() noexcept
标记不可达代码路径
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
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
获取异常类型
NEFORCE_CONSTEXPR20 bool try_parse(const string_view str) noexcept
尝试从字符串解析对象
可字符串化接口
独占智能指针
无序映射容器
动态大小数组容器