nodebuilder.h (2180B)
1 #ifndef NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 #define NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 3 4 #if defined(_MSC_VER) || \ 5 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ 6 (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 7 #pragma once 8 #endif 9 10 #include <vector> 11 12 #include "yaml-cpp/anchor.h" 13 #include "yaml-cpp/emitterstyle.h" 14 #include "yaml-cpp/eventhandler.h" 15 #include "yaml-cpp/node/ptr.h" 16 17 namespace YAML { 18 namespace detail { 19 class node; 20 } // namespace detail 21 struct Mark; 22 } // namespace YAML 23 24 namespace YAML { 25 class Node; 26 27 class NodeBuilder : public EventHandler { 28 public: 29 NodeBuilder(); 30 NodeBuilder(const NodeBuilder&) = delete; 31 NodeBuilder(NodeBuilder&&) = delete; 32 NodeBuilder& operator=(const NodeBuilder&) = delete; 33 NodeBuilder& operator=(NodeBuilder&&) = delete; 34 ~NodeBuilder() override; 35 36 Node Root(); 37 38 void OnDocumentStart(const Mark& mark) override; 39 void OnDocumentEnd() override; 40 41 void OnNull(const Mark& mark, anchor_t anchor) override; 42 void OnAlias(const Mark& mark, anchor_t anchor) override; 43 void OnScalar(const Mark& mark, const std::string& tag, 44 anchor_t anchor, const std::string& value) override; 45 46 void OnSequenceStart(const Mark& mark, const std::string& tag, 47 anchor_t anchor, EmitterStyle::value style) override; 48 void OnSequenceEnd() override; 49 50 void OnMapStart(const Mark& mark, const std::string& tag, 51 anchor_t anchor, EmitterStyle::value style) override; 52 void OnMapEnd() override; 53 54 private: 55 detail::node& Push(const Mark& mark, anchor_t anchor); 56 void Push(detail::node& node); 57 void Pop(); 58 void RegisterAnchor(anchor_t anchor, detail::node& node); 59 60 private: 61 detail::shared_memory_holder m_pMemory; 62 detail::node* m_pRoot; 63 64 using Nodes = std::vector<detail::node *>; 65 Nodes m_stack; 66 Nodes m_anchors; 67 68 using PushedKey = std::pair<detail::node*, bool>; 69 std::vector<PushedKey> m_keys; 70 std::size_t m_mapDepth; 71 }; 72 } // namespace YAML 73 74 #endif // NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66