diff --git a/include/yaml-cpp/node/detail/iterator.h b/include/yaml-cpp/node/detail/iterator.h index e610e7d..88e31ad 100644 --- a/include/yaml-cpp/node/detail/iterator.h +++ b/include/yaml-cpp/node/detail/iterator.h @@ -23,7 +23,7 @@ namespace YAML iterator_base, node_iterator, V, - std::bidirectional_iterator_tag> + std::forward_iterator_tag> { private: template friend class iterator_base; @@ -42,7 +42,6 @@ namespace YAML friend class boost::iterator_core_access; void increment() { this->base_reference() = boost::next(this->base()); } - void decrement() { this->base_reference() = boost::prior(this->base()); } value_type dereference() const { const typename base_type::value_type& v = *this->base(); diff --git a/include/yaml-cpp/node/detail/node_iterator.h b/include/yaml-cpp/node/detail/node_iterator.h index 24d398f..294921b 100644 --- a/include/yaml-cpp/node/detail/node_iterator.h +++ b/include/yaml-cpp/node/detail/node_iterator.h @@ -54,7 +54,7 @@ namespace YAML class node_iterator_base: public boost::iterator_facade< node_iterator_base, node_iterator_value, - std::bidirectional_iterator_tag, + std::forward_iterator_tag, node_iterator_value > { private: @@ -67,11 +67,13 @@ namespace YAML node_iterator_base(): m_type(iterator_type::None) {} explicit node_iterator_base(SeqIter seqIt): m_type(iterator_type::Sequence), m_seqIt(seqIt) {} - explicit node_iterator_base(MapIter mapIt): m_type(iterator_type::Map), m_mapIt(mapIt) {} + explicit node_iterator_base(MapIter mapIt, MapIter mapEnd): m_type(iterator_type::Map), m_mapIt(mapIt), m_mapEnd(mapEnd) { + m_mapIt = increment_until_defined(m_mapIt); + } template node_iterator_base(const node_iterator_base& rhs, typename boost::enable_if, enabler>::type = enabler()) - : m_type(rhs.m_type), m_seqIt(rhs.m_seqIt), m_mapIt(rhs.m_mapIt) {} + : m_type(rhs.m_type), m_seqIt(rhs.m_seqIt), m_mapIt(rhs.m_mapIt), m_mapEnd(rhs.m_mapEnd) {} private: friend class boost::iterator_core_access; @@ -93,19 +95,16 @@ namespace YAML void increment() { switch(m_type) { case iterator_type::None: break; - case iterator_type::Sequence: ++m_seqIt; break; - case iterator_type::Map: ++m_mapIt; break; + case iterator_type::Sequence: + ++m_seqIt; + break; + case iterator_type::Map: + ++m_mapIt; + m_mapIt = increment_until_defined(m_mapIt); + break; } } - - void decrement() { - switch(m_type) { - case iterator_type::None: break; - case iterator_type::Sequence: --m_seqIt; break; - case iterator_type::Map: --m_mapIt; break; - } - } - + value_type dereference() const { switch(m_type) { case iterator_type::None: return value_type(); @@ -115,11 +114,21 @@ namespace YAML return value_type(); } + MapIter increment_until_defined(MapIter it) { + while(it != m_mapEnd && !is_defined(it)) + ++it; + return it; + } + + bool is_defined(MapIter it) const { + return it->first->is_defined() && it->second->is_defined(); + } + private: typename iterator_type::value m_type; SeqIter m_seqIt; - MapIter m_mapIt; + MapIter m_mapIt, m_mapEnd; }; typedef node_iterator_base node_iterator; diff --git a/src/node/detail/node_data.cpp b/src/node/detail/node_data.cpp index 0b460eb..ba3bb04 100644 --- a/src/node/detail/node_data.cpp +++ b/src/node/detail/node_data.cpp @@ -106,7 +106,7 @@ namespace YAML switch(m_type) { case NodeType::Sequence: return const_node_iterator(m_sequence.begin()); - case NodeType::Map: return const_node_iterator(m_map.begin()); + case NodeType::Map: return const_node_iterator(m_map.begin(), m_map.end()); default: return const_node_iterator(); } } @@ -118,7 +118,7 @@ namespace YAML switch(m_type) { case NodeType::Sequence: return node_iterator(m_sequence.begin()); - case NodeType::Map: return node_iterator(m_map.begin()); + case NodeType::Map: return node_iterator(m_map.begin(), m_map.end()); default: return node_iterator(); } } @@ -130,7 +130,7 @@ namespace YAML switch(m_type) { case NodeType::Sequence: return const_node_iterator(m_sequence.end()); - case NodeType::Map: return const_node_iterator(m_map.end()); + case NodeType::Map: return const_node_iterator(m_map.end(), m_map.end()); default: return const_node_iterator(); } } @@ -142,7 +142,7 @@ namespace YAML switch(m_type) { case NodeType::Sequence: return node_iterator(m_sequence.end()); - case NodeType::Map: return node_iterator(m_map.end()); + case NodeType::Map: return node_iterator(m_map.end(), m_map.end()); default: return node_iterator(); } }