1#ifndef NEFORCE_CORE_FILE_YAML_YAML_VALUE_HPP__
2#define NEFORCE_CORE_FILE_YAML_YAML_VALUE_HPP__
161NEFORCE_BEGIN_NAMESPACE__
177class NEFORCE_API yaml_value : public
istringify<yaml_value> {
193 virtual ~yaml_value() =
default;
194 NEFORCE_NODISCARD
virtual types type() const noexcept = 0;
196 NEFORCE_NODISCARD virtual const yaml_null* as_null() const noexcept {
return nullptr; }
197 NEFORCE_NODISCARD
virtual const yaml_boolean* as_boolean() const noexcept {
return nullptr; }
198 NEFORCE_NODISCARD
virtual const yaml_integer* as_integer() const noexcept {
return nullptr; }
199 NEFORCE_NODISCARD
virtual const yaml_float* as_float() const noexcept {
return nullptr; }
200 NEFORCE_NODISCARD
virtual const yaml_string* as_string() const noexcept {
return nullptr; }
201 NEFORCE_NODISCARD
virtual const yaml_timestamp* as_timestamp() const noexcept {
return nullptr; }
202 NEFORCE_NODISCARD
virtual const yaml_sequence* as_sequence() const noexcept {
return nullptr; }
203 NEFORCE_NODISCARD
virtual const yaml_mapping* as_mapping() const noexcept {
return nullptr; }
205 NEFORCE_NODISCARD
bool is_null() const noexcept {
return type() == Null; }
206 NEFORCE_NODISCARD
bool is_boolean() const noexcept {
return type() == Boolean; }
207 NEFORCE_NODISCARD
bool is_integer() const noexcept {
return type() == Integer; }
208 NEFORCE_NODISCARD
bool is_float() const noexcept {
return type() == Float; }
209 NEFORCE_NODISCARD
bool is_string() const noexcept {
return type() == String; }
210 NEFORCE_NODISCARD
bool is_timestamp() const noexcept {
return type() == Timestamp; }
211 NEFORCE_NODISCARD
bool is_sequence() const noexcept {
return type() == Sequence; }
212 NEFORCE_NODISCARD
bool is_mapping() const noexcept {
return type() == Mapping; }
214 void set_anchor(
const string& a) { this->anchor = a; }
215 void set_tag(
const string& t) { this->tag = t; }
217 NEFORCE_NODISCARD
string to_string()
const;
218 NEFORCE_NODISCARD
string to_document()
const;
224class NEFORCE_API yaml_null final :
public yaml_value {
226 yaml_null() =
default;
227 NEFORCE_NODISCARD types type() const noexcept
override {
return Null; }
228 NEFORCE_NODISCARD
const yaml_null* as_null() const noexcept
override {
return this; }
231class NEFORCE_API yaml_boolean final :
public yaml_value {
236 explicit yaml_boolean(
const bool v) noexcept :
238 NEFORCE_NODISCARD types type() const noexcept
override {
return Boolean; }
239 NEFORCE_NODISCARD
const yaml_boolean* as_boolean() const noexcept
override {
return this; }
240 NEFORCE_NODISCARD
bool get_value() const noexcept {
return value; }
243class NEFORCE_API yaml_integer final :
public yaml_value {
248 explicit yaml_integer(
const int64_t v) noexcept :
250 NEFORCE_NODISCARD types type() const noexcept
override {
return Integer; }
251 NEFORCE_NODISCARD
const yaml_integer* as_integer() const noexcept
override {
return this; }
252 NEFORCE_NODISCARD
int64_t get_value() const noexcept {
return value; }
255class NEFORCE_API yaml_float final :
public yaml_value {
260 explicit yaml_float(
const double v) noexcept :
262 NEFORCE_NODISCARD types type() const noexcept
override {
return Float; }
263 NEFORCE_NODISCARD
const yaml_float* as_float() const noexcept
override {
return this; }
264 NEFORCE_NODISCARD
double get_value() const noexcept {
return value; }
267class NEFORCE_API yaml_string final :
public yaml_value {
282 explicit yaml_string(
string v,
const string_style s = Plain) noexcept :
283 value(_NEFORCE
move(v)),
286 NEFORCE_NODISCARD types type() const noexcept
override {
return String; }
287 NEFORCE_NODISCARD
const yaml_string* as_string() const noexcept
override {
return this; }
288 NEFORCE_NODISCARD
const string& get_value() const noexcept {
return value; }
289 NEFORCE_NODISCARD string_style get_style() const noexcept {
return style; }
292class NEFORCE_API yaml_timestamp final :
public yaml_value {
302 NEFORCE_THROW_EXCEPTION(yaml_exception((
"Invalid timestamp format: " +
string(v)).
data()));
306 explicit yaml_timestamp(
const datetime& dt) noexcept :
309 NEFORCE_NODISCARD types type() const noexcept
override {
return Timestamp; }
310 NEFORCE_NODISCARD
const yaml_timestamp* as_timestamp() const noexcept
override {
return this; }
311 NEFORCE_NODISCARD
const datetime& get_value() const noexcept {
return value; }
313 NEFORCE_NODISCARD
string get_string_value() const noexcept {
return value.
to_RFC3339(); }
316class NEFORCE_API yaml_sequence final :
public yaml_value {
318 enum sequence_style {
324 vector<yaml_ptr> elements;
325 sequence_style style;
328 explicit yaml_sequence(
const sequence_style s = Block) :
331 yaml_sequence(
const yaml_sequence&) =
delete;
332 yaml_sequence& operator=(
const yaml_sequence&) =
delete;
333 yaml_sequence(yaml_sequence&&) =
default;
334 yaml_sequence& operator=(yaml_sequence&&) =
default;
336 NEFORCE_NODISCARD types type() const noexcept
override {
return Sequence; }
337 NEFORCE_NODISCARD
const yaml_sequence* as_sequence() const noexcept
override {
return this; }
339 void add_element(yaml_ptr value) { elements.emplace_back(_NEFORCE
move(value)); }
341 NEFORCE_NODISCARD
const yaml_value* get_element(
const size_t index)
const noexcept {
342 if (index < elements.size()) {
343 return elements[index].get();
348 NEFORCE_NODISCARD yaml_value* get_element(
const size_t index)
noexcept {
349 if (index < elements.size()) {
350 return elements[index].get();
355 NEFORCE_NODISCARD
size_t size() const noexcept {
return elements.size(); }
356 NEFORCE_NODISCARD
const vector<yaml_ptr>& get_elements() const noexcept {
return elements; }
357 NEFORCE_NODISCARD sequence_style get_style() const noexcept {
return style; }
358 void set_style(
const sequence_style s)
noexcept { style = s; }
361class NEFORCE_API yaml_mapping final :
public yaml_value {
369 unordered_map<string, yaml_ptr> members;
373 explicit yaml_mapping(
const mapping_style s = Block) :
376 yaml_mapping(
const yaml_mapping&) =
delete;
377 yaml_mapping& operator=(
const yaml_mapping&) =
delete;
378 yaml_mapping(yaml_mapping&&) =
default;
379 yaml_mapping& operator=(yaml_mapping&&) =
default;
381 NEFORCE_NODISCARD types type() const noexcept
override {
return Mapping; }
382 NEFORCE_NODISCARD
const yaml_mapping* as_mapping() const noexcept
override {
return this; }
384 void add_member(
const string& key, yaml_ptr value) { members[key] = _NEFORCE
move(value); }
386 NEFORCE_NODISCARD
const yaml_value* get_member(
const string& key)
const {
387 const auto it = members.
find(key);
388 if (it != members.
end()) {
389 return it->second.get();
394 NEFORCE_NODISCARD yaml_value* get_member(
const string& key) {
395 const auto it = members.
find(key);
396 if (it != members.
end()) {
397 return it->second.get();
402 NEFORCE_NODISCARD
bool has_member(
const string& key)
const {
return members.
find(key) != members.
end(); }
404 NEFORCE_NODISCARD
const unordered_map<string, yaml_ptr>& get_members() const noexcept {
return members; }
406 NEFORCE_NODISCARD mapping_style get_style() const noexcept {
return style; }
407 void set_style(
const mapping_style s)
noexcept { style = s; }
409 void merge_from(
const yaml_mapping* other) {
413 for (
const auto& pair: other->get_members()) {
414 if (members.
find(pair.first) == members.
end()) {
415 members[pair.first] = pair.second;
421NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string to_RFC3339() const
转换为 RFC 3339
NEFORCE_CONSTEXPR20 bool try_parse_RFC3339(const string_view view) noexcept
尝试解析 RFC 3339
NEFORCE_CONSTEXPR20 bool try_parse_ISO8601(const string_view view) noexcept
尝试解析 ISO 8601
NEFORCE_NODISCARD iterator find(const key_type &key)
查找具有指定键的元素
NEFORCE_NODISCARD iterator end() noexcept
获取结束迭代器
long long int64_t
64位有符号整数类型
#define NEFORCE_ERROR_BUILD_FINAL_CLASS(THIS, BASE, INFO)
构建最终异常类宏
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
NEFORCE_CONSTEXPR20 string to_string(const CharT &c)
将字符转换为普通字符串