Free Electron
graphbuilderadapter.h
1 #ifndef GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define GRAPHBUILDERADAPTER_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 <cstdlib>
11 #include <map>
12 #include <stack>
13 
14 #include "yaml-cpp/anchor.h"
15 #include "yaml-cpp/contrib/anchordict.h"
16 #include "yaml-cpp/emitterstyle.h"
17 #include "yaml-cpp/eventhandler.h"
18 
19 namespace YAML {
20 class GraphBuilderInterface;
21 struct Mark;
22 } // namespace YAML
23 
24 namespace YAML {
25 class GraphBuilderAdapter : public EventHandler {
26  public:
27  GraphBuilderAdapter(GraphBuilderInterface& builder)
28  : m_builder(builder),
29  m_containers{},
30  m_anchors{},
31  m_pRootNode(nullptr),
32  m_pKeyNode(nullptr) {}
33  GraphBuilderAdapter(const GraphBuilderAdapter&) = delete;
34  GraphBuilderAdapter(GraphBuilderAdapter&&) = delete;
35  GraphBuilderAdapter& operator=(const GraphBuilderAdapter&) = delete;
36  GraphBuilderAdapter& operator=(GraphBuilderAdapter&&) = delete;
37 
38  virtual void OnDocumentStart(const Mark& mark) { (void)mark; }
39  virtual void OnDocumentEnd() {}
40 
41  virtual void OnNull(const Mark& mark, anchor_t anchor);
42  virtual void OnAlias(const Mark& mark, anchor_t anchor);
43  virtual void OnScalar(const Mark& mark, const std::string& tag,
44  anchor_t anchor, const std::string& value);
45 
46  virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
47  anchor_t anchor, EmitterStyle::value style);
48  virtual void OnSequenceEnd();
49 
50  virtual void OnMapStart(const Mark& mark, const std::string& tag,
51  anchor_t anchor, EmitterStyle::value style);
52  virtual void OnMapEnd();
53 
54  void* RootNode() const { return m_pRootNode; }
55 
56  private:
57  struct ContainerFrame {
58  ContainerFrame(void* pSequence)
59  : pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {}
60  ContainerFrame(void* pMap, void* pPreviousKeyNode)
61  : pContainer(pMap), pPrevKeyNode(pPreviousKeyNode) {}
62 
63  void* pContainer;
64  void* pPrevKeyNode;
65 
66  bool isMap() const { return pPrevKeyNode != &sequenceMarker; }
67 
68  private:
69  static int sequenceMarker;
70  };
71  typedef std::stack<ContainerFrame> ContainerStack;
72  typedef AnchorDict<void*> AnchorMap;
73 
74  GraphBuilderInterface& m_builder;
75  ContainerStack m_containers;
76  AnchorMap m_anchors;
77  void* m_pRootNode;
78  void* m_pKeyNode;
79 
80  void* GetCurrentParent() const;
81  void RegisterAnchor(anchor_t anchor, void* pNode);
82  void DispositionNode(void* pNode);
83 };
84 } // namespace YAML
85 
86 #endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
Definition: anchor.h:12