BRE12
node_iterator.h
1 #ifndef VALUE_DETAIL_NODE_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define VALUE_DETAIL_NODE_ITERATOR_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/dll.h"
11 #include "yaml-cpp/node/ptr.h"
12 #include <cstddef>
13 #include <iterator>
14 #include <memory>
15 #include <map>
16 #include <utility>
17 #include <vector>
18 
19 namespace YAML {
20 namespace detail {
21 struct iterator_type {
22  enum value { None, Sequence, Map };
23 };
24 
25 template <typename V>
26 struct node_iterator_value : public std::pair<V*, V*> {
27  typedef std::pair<V*, V*> kv;
28 
29  node_iterator_value() : kv(), pNode(0) {}
30  explicit node_iterator_value(V& rhs) : kv(), pNode(&rhs) {}
31  explicit node_iterator_value(V& key, V& value) : kv(&key, &value), pNode(0) {}
32 
33  V& operator*() const { return *pNode; }
34  V& operator->() const { return *pNode; }
35 
36  V* pNode;
37 };
38 
39 typedef std::vector<node*> node_seq;
40 typedef std::vector<std::pair<node*, node*>> node_map;
41 
42 template <typename V>
44  typedef node_seq::iterator seq;
45  typedef node_map::iterator map;
46 };
47 
48 template <typename V>
49 struct node_iterator_type<const V> {
50  typedef node_seq::const_iterator seq;
51  typedef node_map::const_iterator map;
52 };
53 
54 template <typename V>
56  : public std::iterator<std::forward_iterator_tag, node_iterator_value<V>,
57  std::ptrdiff_t, node_iterator_value<V>*,
58  node_iterator_value<V>> {
59  private:
60  struct enabler {};
61 
62  struct proxy {
63  explicit proxy(const node_iterator_value<V>& x) : m_ref(x) {}
64  node_iterator_value<V>* operator->() { return std::addressof(m_ref); }
65  operator node_iterator_value<V>*() { return std::addressof(m_ref); }
66 
68  };
69 
70  public:
71  typedef typename node_iterator_type<V>::seq SeqIter;
72  typedef typename node_iterator_type<V>::map MapIter;
74 
76  : m_type(iterator_type::None), m_seqIt(), m_mapIt(), m_mapEnd() {}
77  explicit node_iterator_base(SeqIter seqIt)
78  : m_type(iterator_type::Sequence),
79  m_seqIt(seqIt),
80  m_mapIt(),
81  m_mapEnd() {}
82  explicit node_iterator_base(MapIter mapIt, MapIter mapEnd)
83  : m_type(iterator_type::Map),
84  m_seqIt(),
85  m_mapIt(mapIt),
86  m_mapEnd(mapEnd) {
87  m_mapIt = increment_until_defined(m_mapIt);
88  }
89 
90  template <typename W>
92  typename std::enable_if<std::is_convertible<W*, V*>::value,
93  enabler>::type = enabler())
94  : m_type(rhs.m_type),
95  m_seqIt(rhs.m_seqIt),
96  m_mapIt(rhs.m_mapIt),
97  m_mapEnd(rhs.m_mapEnd) {}
98 
99  template <typename>
100  friend class node_iterator_base;
101 
102  template <typename W>
103  bool operator==(const node_iterator_base<W>& rhs) const {
104  if (m_type != rhs.m_type)
105  return false;
106 
107  switch (m_type) {
108  case iterator_type::None:
109  return true;
110  case iterator_type::Sequence:
111  return m_seqIt == rhs.m_seqIt;
112  case iterator_type::Map:
113  return m_mapIt == rhs.m_mapIt;
114  }
115  return true;
116  }
117 
118  template <typename W>
119  bool operator!=(const node_iterator_base<W>& rhs) const {
120  return !(*this == rhs);
121  }
122 
123  node_iterator_base<V>& operator++() {
124  switch (m_type) {
125  case iterator_type::None:
126  break;
127  case iterator_type::Sequence:
128  ++m_seqIt;
129  break;
130  case iterator_type::Map:
131  ++m_mapIt;
132  m_mapIt = increment_until_defined(m_mapIt);
133  break;
134  }
135  return *this;
136  }
137 
138  node_iterator_base<V> operator++(int) {
139  node_iterator_base<V> iterator_pre(*this);
140  ++(*this);
141  return iterator_pre;
142  }
143 
144  value_type operator*() const {
145  switch (m_type) {
146  case iterator_type::None:
147  return value_type();
148  case iterator_type::Sequence:
149  return value_type(**m_seqIt);
150  case iterator_type::Map:
151  return value_type(*m_mapIt->first, *m_mapIt->second);
152  }
153  return value_type();
154  }
155 
156  proxy operator->() const { return proxy(**this); }
157 
158  MapIter increment_until_defined(MapIter it) {
159  while (it != m_mapEnd && !is_defined(it))
160  ++it;
161  return it;
162  }
163 
164  bool is_defined(MapIter it) const {
165  return it->first->is_defined() && it->second->is_defined();
166  }
167 
168  private:
169  typename iterator_type::value m_type;
170 
171  SeqIter m_seqIt;
172  MapIter m_mapIt, m_mapEnd;
173 };
174 
177 }
178 }
179 
180 #endif // VALUE_DETAIL_NODE_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66
Definition: node_iterator.h:43
Definition: node_iterator.h:26
Definition: node_iterator.h:55
Definition: node_iterator.h:21
Definition: DrawableObjectLoader.h:10