1 #ifndef NODE_DETAIL_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 #define NODE_DETAIL_NODE_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/dll.h" 11 #include "yaml-cpp/emitterstyle.h" 12 #include "yaml-cpp/node/detail/node_ref.h" 13 #include "yaml-cpp/node/ptr.h" 14 #include "yaml-cpp/node/type.h" 23 bool operator ()(
const node* l,
const node* r)
const {
return l->m_index < r->m_index;}
27 node() : m_pRef(new node_ref), m_dependencies{}, m_index{} {}
28 node(
const node&) =
delete;
29 node& operator=(
const node&) =
delete;
31 bool is(
const node& rhs)
const {
return m_pRef == rhs.m_pRef; }
32 const node_ref* ref()
const {
return m_pRef.get(); }
34 bool is_defined()
const {
return m_pRef->is_defined(); }
35 const Mark& mark()
const {
return m_pRef->mark(); }
36 NodeType::value type()
const {
return m_pRef->type(); }
38 const std::string& scalar()
const {
return m_pRef->scalar(); }
39 const std::string& tag()
const {
return m_pRef->tag(); }
40 EmitterStyle::value style()
const {
return m_pRef->style(); }
43 bool equals(
const T& rhs, shared_memory_holder pMemory);
44 bool equals(
const char* rhs, shared_memory_holder pMemory);
50 m_pRef->mark_defined();
51 for (node* dependency : m_dependencies)
52 dependency->mark_defined();
53 m_dependencies.clear();
56 void add_dependency(node& rhs) {
60 m_dependencies.insert(&rhs);
63 void set_ref(
const node& rhs) {
68 void set_data(
const node& rhs) {
71 m_pRef->set_data(*rhs.m_pRef);
74 void set_mark(
const Mark& mark) { m_pRef->set_mark(mark); }
76 void set_type(NodeType::value type) {
77 if (type != NodeType::Undefined)
79 m_pRef->set_type(type);
85 void set_scalar(
const std::string& scalar) {
87 m_pRef->set_scalar(scalar);
89 void set_tag(
const std::string& tag) {
95 void set_style(EmitterStyle::value style) {
97 m_pRef->set_style(style);
101 std::size_t size()
const {
return m_pRef->size(); }
103 const_node_iterator begin()
const {
104 return static_cast<const node_ref&
>(*m_pRef).begin();
106 node_iterator begin() {
return m_pRef->begin(); }
108 const_node_iterator end()
const {
109 return static_cast<const node_ref&
>(*m_pRef).end();
111 node_iterator end() {
return m_pRef->end(); }
114 void push_back(node& input, shared_memory_holder pMemory) {
115 m_pRef->push_back(input, pMemory);
116 input.add_dependency(*
this);
117 m_index = m_amount.fetch_add(1);
119 void insert(node& key, node& value, shared_memory_holder pMemory) {
120 m_pRef->insert(key, value, pMemory);
121 key.add_dependency(*
this);
122 value.add_dependency(*
this);
126 template <
typename Key>
127 node*
get(
const Key& key, shared_memory_holder pMemory)
const {
131 return static_cast<const node_ref&
>(*m_pRef).get(key, pMemory);
133 template <
typename Key>
134 node&
get(
const Key& key, shared_memory_holder pMemory) {
135 node& value = m_pRef->get(key, pMemory);
136 value.add_dependency(*
this);
139 template <
typename Key>
140 bool remove(
const Key& key, shared_memory_holder pMemory) {
141 return m_pRef->remove(key, pMemory);
144 node*
get(node& key, shared_memory_holder pMemory)
const {
148 return static_cast<const node_ref&
>(*m_pRef).get(key, pMemory);
150 node&
get(node& key, shared_memory_holder pMemory) {
151 node& value = m_pRef->get(key, pMemory);
152 key.add_dependency(*
this);
153 value.add_dependency(*
this);
156 bool remove(node& key, shared_memory_holder pMemory) {
157 return m_pRef->remove(key, pMemory);
161 template <
typename Key,
typename Value>
162 void force_insert(
const Key& key,
const Value& value,
163 shared_memory_holder pMemory) {
164 m_pRef->force_insert(key, value, pMemory);
168 shared_node_ref m_pRef;
169 using nodes = std::set<node*, less>;
170 nodes m_dependencies;
172 static YAML_CPP_API std::atomic<size_t> m_amount;
177 #endif // NODE_DETAIL_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66