1 #ifndef GRAPHBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 #define GRAPHBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 4 #if defined(_MSC_VER) || \ 5 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \ 6 (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 10 #include "yaml-cpp/mark.h" 20 class GraphBuilderInterface {
22 virtual ~GraphBuilderInterface() = 0;
25 virtual void *NewNull(
const Mark &mark,
void *pParentNode) = 0;
28 virtual void *NewScalar(
const Mark &mark,
const std::string &tag,
29 void *pParentNode,
const std::string &value) = 0;
32 virtual void *NewSequence(
const Mark &mark,
const std::string &tag,
33 void *pParentNode) = 0;
37 virtual void AppendToSequence(
void *pSequence,
void *pNode) = 0;
40 virtual void SequenceComplete(
void *pSequence) { (void)pSequence; }
43 virtual void *NewMap(
const Mark &mark,
const std::string &tag,
44 void *pParentNode) = 0;
48 virtual void AssignInMap(
void *pMap,
void *pKeyNode,
void *pValueNode) = 0;
51 virtual void MapComplete(
void *pMap) { (void)pMap; }
55 virtual void *AnchorReference(
const Mark &mark,
void *pNode) {
69 class GraphBuilder :
public GraphBuilderInterface {
71 typedef typename Impl::Node Node;
72 typedef typename Impl::Sequence Sequence;
73 typedef typename Impl::Map Map;
75 GraphBuilder(Impl &impl) : m_impl(impl) {
77 Sequence *pSeq =
nullptr;
78 Node *pNode =
nullptr;
85 GraphBuilderInterface &AsBuilderInterface() {
return *
this; }
87 virtual void *NewNull(
const Mark &mark,
void *pParentNode) {
88 return CheckType<Node>(m_impl.NewNull(mark, AsNode(pParentNode)));
91 virtual void *NewScalar(
const Mark &mark,
const std::string &tag,
92 void *pParentNode,
const std::string &value) {
93 return CheckType<Node>(
94 m_impl.NewScalar(mark, tag, AsNode(pParentNode), value));
97 virtual void *NewSequence(
const Mark &mark,
const std::string &tag,
99 return CheckType<Sequence>(
100 m_impl.NewSequence(mark, tag, AsNode(pParentNode)));
102 virtual void AppendToSequence(
void *pSequence,
void *pNode) {
103 m_impl.AppendToSequence(AsSequence(pSequence), AsNode(pNode));
105 virtual void SequenceComplete(
void *pSequence) {
106 m_impl.SequenceComplete(AsSequence(pSequence));
109 virtual void *NewMap(
const Mark &mark,
const std::string &tag,
111 return CheckType<Map>(m_impl.NewMap(mark, tag, AsNode(pParentNode)));
113 virtual void AssignInMap(
void *pMap,
void *pKeyNode,
void *pValueNode) {
114 m_impl.AssignInMap(AsMap(pMap), AsNode(pKeyNode), AsNode(pValueNode));
116 virtual void MapComplete(
void *pMap) { m_impl.MapComplete(AsMap(pMap)); }
118 virtual void *AnchorReference(
const Mark &mark,
void *pNode) {
119 return CheckType<Node>(m_impl.AnchorReference(mark, AsNode(pNode)));
126 template <
class T,
class U>
127 static T *CheckType(U *p) {
131 static Node *AsNode(
void *pNode) {
return static_cast<Node *
>(pNode); }
132 static Sequence *AsSequence(
void *pSeq) {
133 return static_cast<Sequence *
>(pSeq);
135 static Map *AsMap(
void *pMap) {
return static_cast<Map *
>(pMap); }
138 void *BuildGraphOfNextDocument(Parser &parser,
139 GraphBuilderInterface &graphBuilder);
141 template <
class Impl>
142 typename Impl::Node *BuildGraphOfNextDocument(Parser &parser, Impl &impl) {
143 GraphBuilder<Impl> graphBuilder(impl);
144 return static_cast<typename Impl::Node *
>(
145 BuildGraphOfNextDocument(parser, graphBuilder));
149 #endif // GRAPHBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66