BRE12
impl.h
1 #ifndef NODE_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define NODE_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
3 
4 #if defined(_MSC_VER) || \
5  (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
6  (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
7 #pragma once
8 #endif
9 
10 #include "yaml-cpp/node/node.h"
11 #include "yaml-cpp/node/iterator.h"
12 #include "yaml-cpp/node/detail/memory.h"
13 #include "yaml-cpp/node/detail/node.h"
14 #include "yaml-cpp/exceptions.h"
15 #include <string>
16 
17 namespace YAML {
18 inline Node::Node() : m_isValid(true), m_pNode(NULL) {}
19 
20 inline Node::Node(NodeType::value type)
21  : m_isValid(true),
22  m_pMemory(new detail::memory_holder),
23  m_pNode(&m_pMemory->create_node()) {
24  m_pNode->set_type(type);
25 }
26 
27 template <typename T>
28 inline Node::Node(const T& rhs)
29  : m_isValid(true),
30  m_pMemory(new detail::memory_holder),
31  m_pNode(&m_pMemory->create_node()) {
32  Assign(rhs);
33 }
34 
35 inline Node::Node(const detail::iterator_value& rhs)
36  : m_isValid(rhs.m_isValid),
37  m_pMemory(rhs.m_pMemory),
38  m_pNode(rhs.m_pNode) {}
39 
40 inline Node::Node(const Node& rhs)
41  : m_isValid(rhs.m_isValid),
42  m_pMemory(rhs.m_pMemory),
43  m_pNode(rhs.m_pNode) {}
44 
45 inline Node::Node(Zombie) : m_isValid(false), m_pNode(NULL) {}
46 
47 inline Node::Node(detail::node& node, detail::shared_memory_holder pMemory)
48  : m_isValid(true), m_pMemory(pMemory), m_pNode(&node) {}
49 
50 inline Node::~Node() {}
51 
52 inline void Node::EnsureNodeExists() const {
53  if (!m_isValid)
54  throw InvalidNode();
55  if (!m_pNode) {
56  m_pMemory.reset(new detail::memory_holder);
57  m_pNode = &m_pMemory->create_node();
58  m_pNode->set_null();
59  }
60 }
61 
62 inline bool Node::IsDefined() const {
63  if (!m_isValid) {
64  return false;
65  }
66  return m_pNode ? m_pNode->is_defined() : true;
67 }
68 
69 inline Mark Node::Mark() const {
70  if (!m_isValid) {
71  throw InvalidNode();
72  }
73  return m_pNode ? m_pNode->mark() : Mark::null_mark();
74 }
75 
76 inline NodeType::value Node::Type() const {
77  if (!m_isValid)
78  throw InvalidNode();
79  return m_pNode ? m_pNode->type() : NodeType::Null;
80 }
81 
82 // access
83 
84 // template helpers
85 template <typename T, typename S>
86 struct as_if {
87  explicit as_if(const Node& node_) : node(node_) {}
88  const Node& node;
89 
90  T operator()(const S& fallback) const {
91  if (!node.m_pNode)
92  return fallback;
93 
94  T t;
95  if (convert<T>::decode(node, t))
96  return t;
97  return fallback;
98  }
99 };
100 
101 template <typename S>
102 struct as_if<std::string, S> {
103  explicit as_if(const Node& node_) : node(node_) {}
104  const Node& node;
105 
106  std::string operator()(const S& fallback) const {
107  if (node.Type() != NodeType::Scalar)
108  return fallback;
109  return node.Scalar();
110  }
111 };
112 
113 template <typename T>
114 struct as_if<T, void> {
115  explicit as_if(const Node& node_) : node(node_) {}
116  const Node& node;
117 
118  T operator()() const {
119  if (!node.m_pNode)
120  throw TypedBadConversion<T>(node.Mark());
121 
122  T t;
123  if (convert<T>::decode(node, t))
124  return t;
125  throw TypedBadConversion<T>(node.Mark());
126  }
127 };
128 
129 template <>
130 struct as_if<std::string, void> {
131  explicit as_if(const Node& node_) : node(node_) {}
132  const Node& node;
133 
134  std::string operator()() const {
135  if (node.Type() != NodeType::Scalar)
136  throw TypedBadConversion<std::string>(node.Mark());
137  return node.Scalar();
138  }
139 };
140 
141 // access functions
142 template <typename T>
143 inline T Node::as() const {
144  if (!m_isValid)
145  throw InvalidNode();
146  return as_if<T, void>(*this)();
147 }
148 
149 template <typename T, typename S>
150 inline T Node::as(const S& fallback) const {
151  if (!m_isValid)
152  return fallback;
153  return as_if<T, S>(*this)(fallback);
154 }
155 
156 inline const std::string& Node::Scalar() const {
157  if (!m_isValid)
158  throw InvalidNode();
159  return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar;
160 }
161 
162 inline const std::string& Node::Tag() const {
163  if (!m_isValid)
164  throw InvalidNode();
165  return m_pNode ? m_pNode->tag() : detail::node_data::empty_scalar;
166 }
167 
168 inline void Node::SetTag(const std::string& tag) {
169  if (!m_isValid)
170  throw InvalidNode();
171  EnsureNodeExists();
172  m_pNode->set_tag(tag);
173 }
174 
175 inline EmitterStyle::value Node::Style() const {
176  if (!m_isValid)
177  throw InvalidNode();
178  return m_pNode ? m_pNode->style() : EmitterStyle::Default;
179 }
180 
181 inline void Node::SetStyle(EmitterStyle::value style) {
182  if (!m_isValid)
183  throw InvalidNode();
184  EnsureNodeExists();
185  m_pNode->set_style(style);
186 }
187 
188 // assignment
189 inline bool Node::is(const Node& rhs) const {
190  if (!m_isValid || !rhs.m_isValid)
191  throw InvalidNode();
192  if (!m_pNode || !rhs.m_pNode)
193  return false;
194  return m_pNode->is(*rhs.m_pNode);
195 }
196 
197 template <typename T>
198 inline Node& Node::operator=(const T& rhs) {
199  if (!m_isValid)
200  throw InvalidNode();
201  Assign(rhs);
202  return *this;
203 }
204 
205 inline void Node::reset(const YAML::Node& rhs) {
206  if (!m_isValid || !rhs.m_isValid)
207  throw InvalidNode();
208  m_pMemory = rhs.m_pMemory;
209  m_pNode = rhs.m_pNode;
210 }
211 
212 template <typename T>
213 inline void Node::Assign(const T& rhs) {
214  if (!m_isValid)
215  throw InvalidNode();
216  AssignData(convert<T>::encode(rhs));
217 }
218 
219 template <>
220 inline void Node::Assign(const std::string& rhs) {
221  if (!m_isValid)
222  throw InvalidNode();
223  EnsureNodeExists();
224  m_pNode->set_scalar(rhs);
225 }
226 
227 inline void Node::Assign(const char* rhs) {
228  if (!m_isValid)
229  throw InvalidNode();
230  EnsureNodeExists();
231  m_pNode->set_scalar(rhs);
232 }
233 
234 inline void Node::Assign(char* rhs) {
235  if (!m_isValid)
236  throw InvalidNode();
237  EnsureNodeExists();
238  m_pNode->set_scalar(rhs);
239 }
240 
241 inline Node& Node::operator=(const Node& rhs) {
242  if (!m_isValid || !rhs.m_isValid)
243  throw InvalidNode();
244  if (is(rhs))
245  return *this;
246  AssignNode(rhs);
247  return *this;
248 }
249 
250 inline void Node::AssignData(const Node& rhs) {
251  if (!m_isValid || !rhs.m_isValid)
252  throw InvalidNode();
253  EnsureNodeExists();
254  rhs.EnsureNodeExists();
255 
256  m_pNode->set_data(*rhs.m_pNode);
257  m_pMemory->merge(*rhs.m_pMemory);
258 }
259 
260 inline void Node::AssignNode(const Node& rhs) {
261  if (!m_isValid || !rhs.m_isValid)
262  throw InvalidNode();
263  rhs.EnsureNodeExists();
264 
265  if (!m_pNode) {
266  m_pNode = rhs.m_pNode;
267  m_pMemory = rhs.m_pMemory;
268  return;
269  }
270 
271  m_pNode->set_ref(*rhs.m_pNode);
272  m_pMemory->merge(*rhs.m_pMemory);
273  m_pNode = rhs.m_pNode;
274 }
275 
276 // size/iterator
277 inline std::size_t Node::size() const {
278  if (!m_isValid)
279  throw InvalidNode();
280  return m_pNode ? m_pNode->size() : 0;
281 }
282 
283 inline const_iterator Node::begin() const {
284  if (!m_isValid)
285  return const_iterator();
286  return m_pNode ? const_iterator(m_pNode->begin(), m_pMemory)
287  : const_iterator();
288 }
289 
290 inline iterator Node::begin() {
291  if (!m_isValid)
292  return iterator();
293  return m_pNode ? iterator(m_pNode->begin(), m_pMemory) : iterator();
294 }
295 
296 inline const_iterator Node::end() const {
297  if (!m_isValid)
298  return const_iterator();
299  return m_pNode ? const_iterator(m_pNode->end(), m_pMemory) : const_iterator();
300 }
301 
302 inline iterator Node::end() {
303  if (!m_isValid)
304  return iterator();
305  return m_pNode ? iterator(m_pNode->end(), m_pMemory) : iterator();
306 }
307 
308 // sequence
309 template <typename T>
310 inline void Node::push_back(const T& rhs) {
311  if (!m_isValid)
312  throw InvalidNode();
313  push_back(Node(rhs));
314 }
315 
316 inline void Node::push_back(const Node& rhs) {
317  if (!m_isValid || !rhs.m_isValid)
318  throw InvalidNode();
319  EnsureNodeExists();
320  rhs.EnsureNodeExists();
321 
322  m_pNode->push_back(*rhs.m_pNode, m_pMemory);
323  m_pMemory->merge(*rhs.m_pMemory);
324 }
325 
326 // helpers for indexing
327 namespace detail {
328 template <typename T>
329 struct to_value_t {
330  explicit to_value_t(const T& t_) : t(t_) {}
331  const T& t;
332  typedef const T& return_type;
333 
334  const T& operator()() const { return t; }
335 };
336 
337 template <>
338 struct to_value_t<const char*> {
339  explicit to_value_t(const char* t_) : t(t_) {}
340  const char* t;
341  typedef std::string return_type;
342 
343  const std::string operator()() const { return t; }
344 };
345 
346 template <>
347 struct to_value_t<char*> {
348  explicit to_value_t(char* t_) : t(t_) {}
349  const char* t;
350  typedef std::string return_type;
351 
352  const std::string operator()() const { return t; }
353 };
354 
355 template <std::size_t N>
356 struct to_value_t<char[N]> {
357  explicit to_value_t(const char* t_) : t(t_) {}
358  const char* t;
359  typedef std::string return_type;
360 
361  const std::string operator()() const { return t; }
362 };
363 
364 // converts C-strings to std::strings so they can be copied
365 template <typename T>
366 inline typename to_value_t<T>::return_type to_value(const T& t) {
367  return to_value_t<T>(t)();
368 }
369 }
370 
371 // indexing
372 template <typename Key>
373 inline const Node Node::operator[](const Key& key) const {
374  if (!m_isValid)
375  throw InvalidNode();
376  EnsureNodeExists();
377  detail::node* value = static_cast<const detail::node&>(*m_pNode)
378  .get(detail::to_value(key), m_pMemory);
379  if (!value) {
380  return Node(ZombieNode);
381  }
382  return Node(*value, m_pMemory);
383 }
384 
385 template <typename Key>
386 inline Node Node::operator[](const Key& key) {
387  if (!m_isValid)
388  throw InvalidNode();
389  EnsureNodeExists();
390  detail::node& value = m_pNode->get(detail::to_value(key), m_pMemory);
391  return Node(value, m_pMemory);
392 }
393 
394 template <typename Key>
395 inline bool Node::remove(const Key& key) {
396  if (!m_isValid)
397  throw InvalidNode();
398  EnsureNodeExists();
399  return m_pNode->remove(detail::to_value(key), m_pMemory);
400 }
401 
402 inline const Node Node::operator[](const Node& key) const {
403  if (!m_isValid || !key.m_isValid)
404  throw InvalidNode();
405  EnsureNodeExists();
406  key.EnsureNodeExists();
407  m_pMemory->merge(*key.m_pMemory);
408  detail::node* value =
409  static_cast<const detail::node&>(*m_pNode).get(*key.m_pNode, m_pMemory);
410  if (!value) {
411  return Node(ZombieNode);
412  }
413  return Node(*value, m_pMemory);
414 }
415 
416 inline Node Node::operator[](const Node& key) {
417  if (!m_isValid || !key.m_isValid)
418  throw InvalidNode();
419  EnsureNodeExists();
420  key.EnsureNodeExists();
421  m_pMemory->merge(*key.m_pMemory);
422  detail::node& value = m_pNode->get(*key.m_pNode, m_pMemory);
423  return Node(value, m_pMemory);
424 }
425 
426 inline bool Node::remove(const Node& key) {
427  if (!m_isValid || !key.m_isValid)
428  throw InvalidNode();
429  EnsureNodeExists();
430  key.EnsureNodeExists();
431  return m_pNode->remove(*key.m_pNode, m_pMemory);
432 }
433 
434 // map
435 template <typename Key, typename Value>
436 inline void Node::force_insert(const Key& key, const Value& value) {
437  if (!m_isValid)
438  throw InvalidNode();
439  EnsureNodeExists();
440  m_pNode->force_insert(detail::to_value(key), detail::to_value(value),
441  m_pMemory);
442 }
443 
444 // free functions
445 inline bool operator==(const Node& lhs, const Node& rhs) { return lhs.is(rhs); }
446 }
447 
448 #endif // NODE_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
Definition: impl.h:114
Definition: iterator.h:21
Definition: _tbb_windef.h:37
Definition: exceptions.h:204
Definition: convert.h:28
Definition: node.h:19
Definition: impl.h:86
Definition: exceptions.h:187
Definition: DrawableObjectLoader.h:10
Definition: impl.h:329
Definition: node.h:29