| #ifndef GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 | |
| #define GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 | |
| #if defined(_MSC_VER) || \ | |
| (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ | |
| (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 | |
| #pragma once | |
| #endif | |
| #include <cstdlib> | |
| #include <map> | |
| #include <stack> | |
| #include "yaml-cpp/anchor.h" | |
| #include "yaml-cpp/contrib/anchordict.h" | |
| #include "yaml-cpp/emitterstyle.h" | |
| #include "yaml-cpp/eventhandler.h" | |
| namespace YAML { | |
| class GraphBuilderInterface; | |
| struct Mark; | |
| } // namespace YAML | |
| namespace YAML { | |
| class GraphBuilderAdapter : public EventHandler { | |
| public: | |
| GraphBuilderAdapter(GraphBuilderInterface& builder) | |
| : m_builder(builder), | |
| m_containers{}, | |
| m_anchors{}, | |
| m_pRootNode(nullptr), | |
| m_pKeyNode(nullptr) {} | |
| GraphBuilderAdapter(const GraphBuilderAdapter&) = delete; | |
| GraphBuilderAdapter(GraphBuilderAdapter&&) = delete; | |
| GraphBuilderAdapter& operator=(const GraphBuilderAdapter&) = delete; | |
| GraphBuilderAdapter& operator=(GraphBuilderAdapter&&) = delete; | |
| virtual void OnDocumentStart(const Mark& mark) { (void)mark; } | |
| virtual void OnDocumentEnd() {} | |
| virtual void OnNull(const Mark& mark, anchor_t anchor); | |
| virtual void OnAlias(const Mark& mark, anchor_t anchor); | |
| virtual void OnScalar(const Mark& mark, const std::string& tag, | |
| anchor_t anchor, const std::string& value); | |
| virtual void OnSequenceStart(const Mark& mark, const std::string& tag, | |
| anchor_t anchor, EmitterStyle::value style); | |
| virtual void OnSequenceEnd(); | |
| virtual void OnMapStart(const Mark& mark, const std::string& tag, | |
| anchor_t anchor, EmitterStyle::value style); | |
| virtual void OnMapEnd(); | |
| void* RootNode() const { return m_pRootNode; } | |
| private: | |
| struct ContainerFrame { | |
| ContainerFrame(void* pSequence) | |
| : pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {} | |
| ContainerFrame(void* pMap, void* pPreviousKeyNode) | |
| : pContainer(pMap), pPrevKeyNode(pPreviousKeyNode) {} | |
| void* pContainer; | |
| void* pPrevKeyNode; | |
| bool isMap() const { return pPrevKeyNode != &sequenceMarker; } | |
| private: | |
| static int sequenceMarker; | |
| }; | |
| typedef std::stack<ContainerFrame> ContainerStack; | |
| typedef AnchorDict<void*> AnchorMap; | |
| GraphBuilderInterface& m_builder; | |
| ContainerStack m_containers; | |
| AnchorMap m_anchors; | |
| void* m_pRootNode; | |
| void* m_pKeyNode; | |
| void* GetCurrentParent() const; | |
| void RegisterAnchor(anchor_t anchor, void* pNode); | |
| void DispositionNode(void* pNode); | |
| }; | |
| } // namespace YAML | |
| #endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 |