NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
yaml_value.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_FILE_YAML_YAML_VALUE_HPP__
2#define NEFORCE_CORE_FILE_YAML_YAML_VALUE_HPP__
3
155
161NEFORCE_BEGIN_NAMESPACE__
162
163NEFORCE_ERROR_BUILD_FINAL_CLASS(yaml_exception, value_exception, "YAML Operation Failed.")
164
165
166class yaml_value;
167class yaml_null;
168class yaml_boolean;
169class yaml_integer;
170class yaml_float;
171class yaml_string;
172class yaml_timestamp;
173class yaml_sequence;
174class yaml_mapping;
175
176
177class NEFORCE_API yaml_value : public istringify<yaml_value> {
178public:
179 string anchor;
180 string tag;
181
182 enum types {
183 Null,
184 Boolean,
185 Integer,
186 Float,
187 String,
188 Timestamp,
189 Sequence,
190 Mapping
191 };
192
193 virtual ~yaml_value() = default;
194 NEFORCE_NODISCARD virtual types type() const noexcept = 0;
195
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; }
204
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; }
213
214 void set_anchor(const string& a) { this->anchor = a; }
215 void set_tag(const string& t) { this->tag = t; }
216
217 NEFORCE_NODISCARD string to_string() const;
218 NEFORCE_NODISCARD string to_document() const;
219};
220
221using yaml_ptr = shared_ptr<yaml_value>;
222
223
224class NEFORCE_API yaml_null final : public yaml_value {
225public:
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; }
229};
230
231class NEFORCE_API yaml_boolean final : public yaml_value {
232private:
233 bool value;
234
235public:
236 explicit yaml_boolean(const bool v) noexcept :
237 value(v) {}
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; }
241};
242
243class NEFORCE_API yaml_integer final : public yaml_value {
244private:
245 int64_t value;
246
247public:
248 explicit yaml_integer(const int64_t v) noexcept :
249 value(v) {}
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; }
253};
254
255class NEFORCE_API yaml_float final : public yaml_value {
256private:
257 double value;
258
259public:
260 explicit yaml_float(const double v) noexcept :
261 value(v) {}
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; }
265};
266
267class NEFORCE_API yaml_string final : public yaml_value {
268public:
269 enum string_style {
270 Plain,
271 SingleQuoted,
272 DoubleQuoted,
273 Literal,
274 Folded
275 };
276
277private:
278 string value;
279 string_style style;
280
281public:
282 explicit yaml_string(string v, const string_style s = Plain) noexcept :
283 value(_NEFORCE move(v)),
284 style(s) {}
285
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; }
290};
291
292class NEFORCE_API yaml_timestamp final : public yaml_value {
293private:
294 datetime value;
295
296public:
297 explicit yaml_timestamp(const string_view v) {
298 datetime dt;
299 if (dt.try_parse_RFC3339(v) || dt.try_parse_ISO8601(v)) {
300 value = dt;
301 } else {
302 NEFORCE_THROW_EXCEPTION(yaml_exception(("Invalid timestamp format: " + string(v)).data()));
303 }
304 }
305
306 explicit yaml_timestamp(const datetime& dt) noexcept :
307 value(dt) {}
308
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; }
312
313 NEFORCE_NODISCARD string get_string_value() const noexcept { return value.to_RFC3339(); }
314};
315
316class NEFORCE_API yaml_sequence final : public yaml_value {
317public:
318 enum sequence_style {
319 Block,
320 Flow
321 };
322
323private:
324 vector<yaml_ptr> elements;
325 sequence_style style;
326
327public:
328 explicit yaml_sequence(const sequence_style s = Block) :
329 style(s) {}
330
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;
335
336 NEFORCE_NODISCARD types type() const noexcept override { return Sequence; }
337 NEFORCE_NODISCARD const yaml_sequence* as_sequence() const noexcept override { return this; }
338
339 void add_element(yaml_ptr value) { elements.emplace_back(_NEFORCE move(value)); }
340
341 NEFORCE_NODISCARD const yaml_value* get_element(const size_t index) const noexcept {
342 if (index < elements.size()) {
343 return elements[index].get();
344 }
345 return nullptr;
346 }
347
348 NEFORCE_NODISCARD yaml_value* get_element(const size_t index) noexcept {
349 if (index < elements.size()) {
350 return elements[index].get();
351 }
352 return nullptr;
353 }
354
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; }
359};
360
361class NEFORCE_API yaml_mapping final : public yaml_value {
362public:
363 enum mapping_style {
364 Block,
365 Flow
366 };
367
368private:
369 unordered_map<string, yaml_ptr> members;
370 mapping_style style;
371
372public:
373 explicit yaml_mapping(const mapping_style s = Block) :
374 style(s) {}
375
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;
380
381 NEFORCE_NODISCARD types type() const noexcept override { return Mapping; }
382 NEFORCE_NODISCARD const yaml_mapping* as_mapping() const noexcept override { return this; }
383
384 void add_member(const string& key, yaml_ptr value) { members[key] = _NEFORCE move(value); }
385
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();
390 }
391 return nullptr;
392 }
393
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();
398 }
399 return nullptr;
400 }
401
402 NEFORCE_NODISCARD bool has_member(const string& key) const { return members.find(key) != members.end(); }
403
404 NEFORCE_NODISCARD const unordered_map<string, yaml_ptr>& get_members() const noexcept { return members; }
405
406 NEFORCE_NODISCARD mapping_style get_style() const noexcept { return style; }
407 void set_style(const mapping_style s) noexcept { style = s; }
408
409 void merge_from(const yaml_mapping* other) {
410 if (!other) {
411 return;
412 }
413 for (const auto& pair: other->get_members()) {
414 if (members.find(pair.first) == members.end()) {
415 members[pair.first] = pair.second;
416 }
417 }
418 }
419};
420
421NEFORCE_END_NAMESPACE__
422#endif // NEFORCE_CORE_FILE_YAML_YAML_VALUE_HPP__
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)
将字符转换为普通字符串
可字符串化接口
共享智能指针实现
判断类型是否为布尔类型
可字符串化接口
变量处理异常
无序映射容器
动态大小数组容器