1 #ifndef VALUE_DETAIL_NODE_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 2 #define VALUE_DETAIL_NODE_ITERATOR_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/node/ptr.h" 22 enum value { NoneType, Sequence, Map };
27 using kv = std::pair<V*, V*>;
33 V& operator*()
const {
return *pNode; }
34 V& operator->()
const {
return *pNode; }
39 using node_seq = std::vector<node *>;
40 using node_map = std::vector<std::pair<node*, node*>>;
44 using seq = node_seq::iterator;
45 using map = node_map::iterator;
50 using seq = node_seq::const_iterator;
51 using map = node_map::const_iterator;
62 return std::addressof(m_ref);
65 return std::addressof(m_ref);
72 using iterator_category = std::forward_iterator_tag;
74 using difference_type = std::ptrdiff_t;
77 using SeqIter =
typename node_iterator_type<V>::seq;
78 using MapIter =
typename node_iterator_type<V>::map;
81 : m_type(iterator_type::NoneType), m_seqIt(), m_mapIt(), m_mapEnd() {}
83 : m_type(iterator_type::Sequence),
88 : m_type(iterator_type::Map),
92 m_mapIt = increment_until_defined(m_mapIt);
97 typename std::enable_if<std::is_convertible<W*, V*>::value,
98 enabler>::type = enabler())
100 m_seqIt(rhs.m_seqIt),
101 m_mapIt(rhs.m_mapIt),
102 m_mapEnd(rhs.m_mapEnd) {}
107 template <
typename W>
109 if (m_type != rhs.m_type)
113 case iterator_type::NoneType:
115 case iterator_type::Sequence:
116 return m_seqIt == rhs.m_seqIt;
117 case iterator_type::Map:
118 return m_mapIt == rhs.m_mapIt;
123 template <
typename W>
125 return !(*
this == rhs);
130 case iterator_type::NoneType:
132 case iterator_type::Sequence:
135 case iterator_type::Map:
137 m_mapIt = increment_until_defined(m_mapIt);
151 case iterator_type::NoneType:
153 case iterator_type::Sequence:
155 case iterator_type::Map:
156 return value_type(*m_mapIt->first, *m_mapIt->second);
161 proxy operator->()
const {
return proxy(**
this); }
163 MapIter increment_until_defined(MapIter it) {
164 while (it != m_mapEnd && !is_defined(it))
169 bool is_defined(MapIter it)
const {
170 return it->first->is_defined() && it->second->is_defined();
174 typename iterator_type::value m_type;
177 MapIter m_mapIt, m_mapEnd;
185 #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