File indexing completed on 2025-05-12 09:08:10
0001 #ifndef NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
0002 #define NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66
0003
0004 #if defined(_MSC_VER) || \
0005 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
0006 (__GNUC__ >= 4))
0007 #pragma once
0008 #endif
0009
0010 #include <vector>
0011
0012 #include "ATOOLS/YAML/yaml-cpp/anchor.h"
0013 #include "ATOOLS/YAML/yaml-cpp/emitterstyle.h"
0014 #include "ATOOLS/YAML/yaml-cpp/eventhandler.h"
0015 #include "ATOOLS/YAML/yaml-cpp/node/ptr.h"
0016
0017 namespace SHERPA_YAML {
0018 namespace detail {
0019 class node;
0020 }
0021 struct Mark;
0022 }
0023
0024 namespace SHERPA_YAML {
0025 class Node;
0026
0027 class NodeBuilder : public EventHandler {
0028 public:
0029 NodeBuilder();
0030 NodeBuilder(const NodeBuilder&) = delete;
0031 NodeBuilder(NodeBuilder&&) = delete;
0032 NodeBuilder& operator=(const NodeBuilder&) = delete;
0033 NodeBuilder& operator=(NodeBuilder&&) = delete;
0034 ~NodeBuilder() override;
0035
0036 Node Root();
0037
0038 void OnDocumentStart(const Mark& mark) override;
0039 void OnDocumentEnd() override;
0040
0041 void OnNull(const Mark& mark, anchor_t anchor) override;
0042 void OnAlias(const Mark& mark, anchor_t anchor) override;
0043 void OnScalar(const Mark& mark, const std::string& tag,
0044 anchor_t anchor, const std::string& value) override;
0045
0046 void OnSequenceStart(const Mark& mark, const std::string& tag,
0047 anchor_t anchor, EmitterStyle::value style) override;
0048 void OnSequenceEnd() override;
0049
0050 void OnMapStart(const Mark& mark, const std::string& tag,
0051 anchor_t anchor, EmitterStyle::value style) override;
0052 void OnMapEnd() override;
0053
0054 private:
0055 detail::node& Push(const Mark& mark, anchor_t anchor);
0056 void Push(detail::node& node);
0057 void Pop();
0058 void RegisterAnchor(anchor_t anchor, detail::node& node);
0059
0060 private:
0061 detail::shared_memory_holder m_pMemory;
0062 detail::node* m_pRoot;
0063
0064 using Nodes = std::vector<detail::node *>;
0065 Nodes m_stack;
0066 Nodes m_anchors;
0067
0068 using PushedKey = std::pair<detail::node*, bool>;
0069 std::vector<PushedKey> m_keys;
0070 std::size_t m_mapDepth;
0071 };
0072 }
0073
0074 #endif