1 #ifndef GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
3 
4 #if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
5 #pragma once
6 #endif
7 
8 #include <cstdlib>
9 #include <map>
10 #include <stack>
11 #include "yaml-cpp03/eventhandler.h"
12 #include "yaml-cpp03/contrib/anchordict.h"
13 #include "yaml-cpp03/contrib/graphbuilder.h"
14 
15 namespace YAML
16 {
17   class GraphBuilderAdapter : public EventHandler
18   {
19   public:
GraphBuilderAdapter(GraphBuilderInterface & builder)20     GraphBuilderAdapter(GraphBuilderInterface& builder)
21     : m_builder(builder), m_pRootNode(NULL), m_pKeyNode(NULL)
22     {
23     }
24 
OnDocumentStart(const Mark & mark)25     virtual void OnDocumentStart(const Mark& mark) {(void)mark;}
OnDocumentEnd()26     virtual void OnDocumentEnd() {}
27 
28     virtual void OnNull(const Mark& mark, anchor_t anchor);
29     virtual void OnAlias(const Mark& mark, anchor_t anchor);
30     virtual void OnScalar(const Mark& mark, const std::string& tag, anchor_t anchor, const std::string& value);
31 
32     virtual void OnSequenceStart(const Mark& mark, const std::string& tag, anchor_t anchor);
33     virtual void OnSequenceEnd();
34 
35     virtual void OnMapStart(const Mark& mark, const std::string& tag, anchor_t anchor);
36     virtual void OnMapEnd();
37 
RootNode()38     void *RootNode() const {return m_pRootNode;}
39 
40   private:
41     struct ContainerFrame
42     {
ContainerFrameContainerFrame43       ContainerFrame(void *pSequence)
44       : pContainer(pSequence), pPrevKeyNode(&sequenceMarker)
45       {}
ContainerFrameContainerFrame46       ContainerFrame(void *pMap, void* pPrevKeyNode)
47       : pContainer(pMap), pPrevKeyNode(pPrevKeyNode)
48       {}
49 
50       void *pContainer;
51       void *pPrevKeyNode;
52 
isMapContainerFrame53       bool isMap() const {return pPrevKeyNode != &sequenceMarker;}
54 
55     private:
56       static int sequenceMarker;
57     };
58     typedef std::stack<ContainerFrame> ContainerStack;
59     typedef AnchorDict<void*> AnchorMap;
60 
61     GraphBuilderInterface& m_builder;
62     ContainerStack m_containers;
63     AnchorMap m_anchors;
64     void *m_pRootNode;
65     void *m_pKeyNode;
66 
67     void *GetCurrentParent() const;
68     void RegisterAnchor(anchor_t anchor, void *pNode);
69     void DispositionNode(void *pNode);
70   };
71 }
72 
73 #endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
74