Free Electron
nodebuilder.h
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
Definition: anchor.h:12