1#ifndef NEFORCE_CORE_FILE_YAML_YAML_VALUE_HPP__
2#define NEFORCE_CORE_FILE_YAML_YAML_VALUE_HPP__
17NEFORCE_BEGIN_NAMESPACE__
29struct yaml_exception final : value_exception {
30 explicit yaml_exception(
const char* info =
"YAML Operation Failed.",
const char*
type = static_type,
31 const int code = 0) noexcept :
34 explicit yaml_exception(
const exception& e) :
37 ~yaml_exception()
override =
default;
38 static constexpr auto static_type =
"yaml_exception";
216class NEFORCE_API yaml_value :
public istringify<yaml_value> {
249 NEFORCE_NODISCARD virtual
types type() const noexcept = 0;
254 NEFORCE_NODISCARD virtual const
yaml_null* as_null() const noexcept {
return nullptr; }
255 NEFORCE_NODISCARD
virtual const yaml_boolean* as_boolean() const noexcept {
return nullptr; }
256 NEFORCE_NODISCARD
virtual const yaml_integer* as_integer() const noexcept {
return nullptr; }
257 NEFORCE_NODISCARD
virtual const yaml_float* as_float() const noexcept {
return nullptr; }
258 NEFORCE_NODISCARD
virtual const yaml_string* as_string() const noexcept {
return nullptr; }
259 NEFORCE_NODISCARD
virtual const yaml_timestamp* as_timestamp() const noexcept {
return nullptr; }
260 NEFORCE_NODISCARD
virtual const yaml_sequence* as_sequence() const noexcept {
return nullptr; }
261 NEFORCE_NODISCARD
virtual const yaml_mapping* as_mapping() const noexcept {
return nullptr; }
267 NEFORCE_NODISCARD
bool is_null() const noexcept {
return type() == Null; }
268 NEFORCE_NODISCARD
bool is_boolean() const noexcept {
return type() == Boolean; }
269 NEFORCE_NODISCARD
bool is_integer() const noexcept {
return type() == Integer; }
270 NEFORCE_NODISCARD
bool is_float() const noexcept {
return type() == Float; }
271 NEFORCE_NODISCARD
bool is_string() const noexcept {
return type() == String; }
272 NEFORCE_NODISCARD
bool is_timestamp() const noexcept {
return type() == Timestamp; }
273 NEFORCE_NODISCARD
bool is_sequence() const noexcept {
return type() == Sequence; }
274 NEFORCE_NODISCARD
bool is_mapping() const noexcept {
return type() == Mapping; }
287 void set_tag(
const string& t) { this->tag = t; }
309class NEFORCE_API yaml_null final :
public yaml_value {
311 yaml_null() =
default;
312 ~yaml_null()
override =
default;
314 yaml_null(
const yaml_null&) =
default;
315 yaml_null& operator=(
const yaml_null&) =
default;
316 yaml_null(yaml_null&&)
noexcept =
default;
317 yaml_null& operator=(yaml_null&&)
noexcept =
default;
320 NEFORCE_NODISCARD
const yaml_null* as_null() const noexcept
override {
return this; }
331class NEFORCE_API yaml_boolean final :
public yaml_value {
336 ~yaml_boolean()
override =
default;
338 yaml_boolean(
const yaml_boolean&) =
default;
339 yaml_boolean& operator=(
const yaml_boolean&) =
default;
340 yaml_boolean(yaml_boolean&&)
noexcept =
default;
341 yaml_boolean& operator=(yaml_boolean&&)
noexcept =
default;
351 NEFORCE_NODISCARD
const yaml_boolean* as_boolean() const noexcept
override {
return this; }
357 NEFORCE_NODISCARD
bool get_value() const noexcept {
return value; }
372class NEFORCE_API yaml_integer final :
public yaml_value {
377 ~yaml_integer()
override =
default;
379 yaml_integer(
const yaml_integer&) =
default;
380 yaml_integer& operator=(
const yaml_integer&) =
default;
381 yaml_integer(yaml_integer&&)
noexcept =
default;
382 yaml_integer& operator=(yaml_integer&&)
noexcept =
default;
392 NEFORCE_NODISCARD
const yaml_integer* as_integer() const noexcept
override {
return this; }
412class NEFORCE_API yaml_float final :
public yaml_value {
417 ~yaml_float()
override =
default;
419 yaml_float(
const yaml_float&) =
default;
420 yaml_float& operator=(
const yaml_float&) =
default;
421 yaml_float(yaml_float&&)
noexcept =
default;
422 yaml_float& operator=(yaml_float&&)
noexcept =
default;
432 NEFORCE_NODISCARD
const yaml_float* as_float() const noexcept
override {
return this; }
438 NEFORCE_NODISCARD
double get_value() const noexcept {
return value; }
455class NEFORCE_API yaml_string final :
public yaml_value {
487 value(_NEFORCE
move(v)),
491 NEFORCE_NODISCARD
const yaml_string* as_string() const noexcept
override {
return this; }
497 NEFORCE_NODISCARD
const string&
get_value() const noexcept {
return value; }
520class NEFORCE_API yaml_timestamp final :
public yaml_value {
525 ~yaml_timestamp()
override =
default;
527 yaml_timestamp(
const yaml_timestamp&) =
default;
528 yaml_timestamp& operator=(
const yaml_timestamp&) =
default;
529 yaml_timestamp(yaml_timestamp&&)
noexcept =
default;
530 yaml_timestamp& operator=(yaml_timestamp&&)
noexcept =
default;
542 NEFORCE_THROW_EXCEPTION(
yaml_exception((
"Invalid timestamp format: " +
string(v)).
data()));
554 NEFORCE_NODISCARD
const yaml_timestamp* as_timestamp() const noexcept
override {
return this; }
594 sequence_style style;
612 NEFORCE_NODISCARD
const yaml_sequence* as_sequence() const noexcept
override {
return this; }
625 NEFORCE_NODISCARD
const yaml_value*
get_element(
const size_t index)
const noexcept {
626 if (index < elements.size()) {
627 return elements[index].get();
637 NEFORCE_NODISCARD yaml_value*
get_element(
const size_t index)
noexcept {
638 if (index < elements.size()) {
639 return elements[index].get();
648 NEFORCE_NODISCARD
size_t size() const noexcept {
return elements.size(); }
714 NEFORCE_NODISCARD
const yaml_mapping* as_mapping() const noexcept
override {
return this; }
728 NEFORCE_NODISCARD
const yaml_value*
get_member(
const string& key)
const {
729 const auto it = members.find(key);
730 if (it != members.end()) {
731 return it->second.get();
741 NEFORCE_NODISCARD yaml_value*
get_member(
const string& key) {
742 const auto it = members.find(key);
743 if (it != members.end()) {
744 return it->second.get();
754 NEFORCE_NODISCARD
bool has_member(
const string& key)
const {
return members.find(key) != members.end(); }
784 if (other ==
nullptr) {
788 if (members.find(
pair.
first) == members.end()) {
799NEFORCE_END_NAMESPACE__
constexpr bool try_parse_ISO8601(const string_view view) noexcept
尝试解析 ISO 8601
constexpr bool try_parse_RFC3339(const string_view view) noexcept
尝试解析 RFC 3339
bool get_value() const noexcept
获取布尔值
yaml_boolean(const bool v)
构造布尔值
types type() const noexcept override
获取值的具体类型
yaml_float(const double v)
构造浮点数值
types type() const noexcept override
获取值的具体类型
double get_value() const noexcept
获取浮点数值
types type() const noexcept override
获取值的具体类型
int64_t get_value() const noexcept
获取整数值
yaml_integer(const int64_t v)
构造整数值
yaml_value * get_member(const string &key)
获取指定键名的成员(可变版本)
const yaml_value * get_member(const string &key) const
获取指定键名的成员(常量版本)
mapping_style get_style() const noexcept
获取集合样式
void merge_from(const yaml_mapping *other)
合并另一个映射的成员
void set_style(const mapping_style s) noexcept
设置集合样式
bool has_member(const string &key) const
检查键名是否存在
const unordered_map< string, shared_ptr< yaml_value > > & get_members() const noexcept
获取所有成员的常量引用
types type() const noexcept override
获取值的具体类型
void add_member(const string &key, shared_ptr< yaml_value > value)
添加或覆盖键值对
yaml_mapping(const mapping_style s=Block)
构造映射
types type() const noexcept override
获取值的具体类型
types type() const noexcept override
获取值的具体类型
const vector< shared_ptr< yaml_value > > & get_elements() const noexcept
获取所有元素的常量引用
const yaml_value * get_element(const size_t index) const noexcept
获取指定索引的元素(常量版本)
void add_element(shared_ptr< yaml_value > value)
添加元素到序列末尾
yaml_value * get_element(const size_t index) noexcept
获取指定索引的元素(可变版本)
sequence_style get_style() const noexcept
获取集合样式
void set_style(const sequence_style s) noexcept
设置集合样式
size_t size() const noexcept
获取序列大小
yaml_sequence(const sequence_style s=Block)
构造序列
@ SingleQuoted
单引号样式('string')
@ DoubleQuoted
双引号样式("string",支持转义)
types type() const noexcept override
获取值的具体类型
const string & get_value() const noexcept
获取字符串内容
string_style get_style() const noexcept
获取标量样式
string get_string_value() const
获取 RFC 3339 格式的字符串表示
const datetime & get_value() const noexcept
获取日期时间值
types type() const noexcept override
获取值的具体类型
yaml_timestamp(const string_view v)
从字符串构造时间戳(自动检测格式)
yaml_timestamp(const datetime &dt)
从 datetime 对象构造时间戳
string tag
类型标签(YAML !tag 语法),空字符串表示无标签
@ Timestamp
ISO 8601 / RFC 3339 时间戳类型
void set_anchor(const string &a)
设置锚点名
string to_string() const
紧凑单行序列化
void set_tag(const string &t)
设置类型标签
virtual types type() const noexcept=0
获取值的具体类型
string to_document() const
格式化文档序列化
string anchor
锚点名(YAML &anchor 语法),空字符串表示无锚点
long long int64_t
64位有符号整数类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
const char * type() const noexcept
获取异常类型
int code() const noexcept
获取异常码