| #include "graphbuilderadapter.h" | |
| #include "yaml-cpp/contrib/graphbuilder.h" | |
| namespace YAML { | |
| struct Mark; | |
| int GraphBuilderAdapter::ContainerFrame::sequenceMarker; | |
| void GraphBuilderAdapter::OnNull(const Mark &mark, anchor_t anchor) { | |
| void *pParent = GetCurrentParent(); | |
| void *pNode = m_builder.NewNull(mark, pParent); | |
| RegisterAnchor(anchor, pNode); | |
| DispositionNode(pNode); | |
| } | |
| void GraphBuilderAdapter::OnAlias(const Mark &mark, anchor_t anchor) { | |
| void *pReffedNode = m_anchors.Get(anchor); | |
| DispositionNode(m_builder.AnchorReference(mark, pReffedNode)); | |
| } | |
| void GraphBuilderAdapter::OnScalar(const Mark &mark, const std::string &tag, | |
| anchor_t anchor, const std::string &value) { | |
| void *pParent = GetCurrentParent(); | |
| void *pNode = m_builder.NewScalar(mark, tag, pParent, value); | |
| RegisterAnchor(anchor, pNode); | |
| DispositionNode(pNode); | |
| } | |
| void GraphBuilderAdapter::OnSequenceStart(const Mark &mark, | |
| const std::string &tag, | |
| anchor_t anchor, | |
| EmitterStyle::value /* style */) { | |
| void *pNode = m_builder.NewSequence(mark, tag, GetCurrentParent()); | |
| m_containers.push(ContainerFrame(pNode)); | |
| RegisterAnchor(anchor, pNode); | |
| } | |
| void GraphBuilderAdapter::OnSequenceEnd() { | |
| void *pSequence = m_containers.top().pContainer; | |
| m_containers.pop(); | |
| DispositionNode(pSequence); | |
| } | |
| void GraphBuilderAdapter::OnMapStart(const Mark &mark, const std::string &tag, | |
| anchor_t anchor, | |
| EmitterStyle::value /* style */) { | |
| void *pNode = m_builder.NewMap(mark, tag, GetCurrentParent()); | |
| m_containers.push(ContainerFrame(pNode, m_pKeyNode)); | |
| m_pKeyNode = nullptr; | |
| RegisterAnchor(anchor, pNode); | |
| } | |
| void GraphBuilderAdapter::OnMapEnd() { | |
| void *pMap = m_containers.top().pContainer; | |
| m_pKeyNode = m_containers.top().pPrevKeyNode; | |
| m_containers.pop(); | |
| DispositionNode(pMap); | |
| } | |
| void *GraphBuilderAdapter::GetCurrentParent() const { | |
| if (m_containers.empty()) { | |
| return nullptr; | |
| } | |
| return m_containers.top().pContainer; | |
| } | |
| void GraphBuilderAdapter::RegisterAnchor(anchor_t anchor, void *pNode) { | |
| if (anchor) { | |
| m_anchors.Register(anchor, pNode); | |
| } | |
| } | |
| void GraphBuilderAdapter::DispositionNode(void *pNode) { | |
| if (m_containers.empty()) { | |
| m_pRootNode = pNode; | |
| return; | |
| } | |
| void *pContainer = m_containers.top().pContainer; | |
| if (m_containers.top().isMap()) { | |
| if (m_pKeyNode) { | |
| m_builder.AssignInMap(pContainer, m_pKeyNode, pNode); | |
| m_pKeyNode = nullptr; | |
| } else { | |
| m_pKeyNode = pNode; | |
| } | |
| } else { | |
| m_builder.AppendToSequence(pContainer, pNode); | |
| } | |
| } | |
| } // namespace YAML |