mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-10 04:51:17 +00:00
Set the map iterator to filter over undefined items
This commit is contained in:
@@ -23,7 +23,7 @@ namespace YAML
|
|||||||
iterator_base<V>,
|
iterator_base<V>,
|
||||||
node_iterator,
|
node_iterator,
|
||||||
V,
|
V,
|
||||||
std::bidirectional_iterator_tag>
|
std::forward_iterator_tag>
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
template<typename> friend class iterator_base;
|
template<typename> friend class iterator_base;
|
||||||
@@ -42,7 +42,6 @@ namespace YAML
|
|||||||
friend class boost::iterator_core_access;
|
friend class boost::iterator_core_access;
|
||||||
|
|
||||||
void increment() { this->base_reference() = boost::next(this->base()); }
|
void increment() { this->base_reference() = boost::next(this->base()); }
|
||||||
void decrement() { this->base_reference() = boost::prior(this->base()); }
|
|
||||||
|
|
||||||
value_type dereference() const {
|
value_type dereference() const {
|
||||||
const typename base_type::value_type& v = *this->base();
|
const typename base_type::value_type& v = *this->base();
|
||||||
|
@@ -54,7 +54,7 @@ namespace YAML
|
|||||||
class node_iterator_base: public boost::iterator_facade<
|
class node_iterator_base: public boost::iterator_facade<
|
||||||
node_iterator_base<V>,
|
node_iterator_base<V>,
|
||||||
node_iterator_value<V>,
|
node_iterator_value<V>,
|
||||||
std::bidirectional_iterator_tag,
|
std::forward_iterator_tag,
|
||||||
node_iterator_value<V> >
|
node_iterator_value<V> >
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@@ -67,11 +67,13 @@ namespace YAML
|
|||||||
|
|
||||||
node_iterator_base(): m_type(iterator_type::None) {}
|
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(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<typename W>
|
template<typename W>
|
||||||
node_iterator_base(const node_iterator_base<W>& rhs, typename boost::enable_if<boost::is_convertible<W*, V*>, enabler>::type = enabler())
|
node_iterator_base(const node_iterator_base<W>& rhs, typename boost::enable_if<boost::is_convertible<W*, V*>, 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:
|
private:
|
||||||
friend class boost::iterator_core_access;
|
friend class boost::iterator_core_access;
|
||||||
@@ -93,16 +95,13 @@ namespace YAML
|
|||||||
void increment() {
|
void increment() {
|
||||||
switch(m_type) {
|
switch(m_type) {
|
||||||
case iterator_type::None: break;
|
case iterator_type::None: break;
|
||||||
case iterator_type::Sequence: ++m_seqIt; break;
|
case iterator_type::Sequence:
|
||||||
case iterator_type::Map: ++m_mapIt; break;
|
++m_seqIt;
|
||||||
}
|
break;
|
||||||
}
|
case iterator_type::Map:
|
||||||
|
++m_mapIt;
|
||||||
void decrement() {
|
m_mapIt = increment_until_defined(m_mapIt);
|
||||||
switch(m_type) {
|
break;
|
||||||
case iterator_type::None: break;
|
|
||||||
case iterator_type::Sequence: --m_seqIt; break;
|
|
||||||
case iterator_type::Map: --m_mapIt; break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,11 +114,21 @@ namespace YAML
|
|||||||
return value_type();
|
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:
|
private:
|
||||||
typename iterator_type::value m_type;
|
typename iterator_type::value m_type;
|
||||||
|
|
||||||
SeqIter m_seqIt;
|
SeqIter m_seqIt;
|
||||||
MapIter m_mapIt;
|
MapIter m_mapIt, m_mapEnd;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef node_iterator_base<node> node_iterator;
|
typedef node_iterator_base<node> node_iterator;
|
||||||
|
@@ -106,7 +106,7 @@ namespace YAML
|
|||||||
|
|
||||||
switch(m_type) {
|
switch(m_type) {
|
||||||
case NodeType::Sequence: return const_node_iterator(m_sequence.begin());
|
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();
|
default: return const_node_iterator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ namespace YAML
|
|||||||
|
|
||||||
switch(m_type) {
|
switch(m_type) {
|
||||||
case NodeType::Sequence: return node_iterator(m_sequence.begin());
|
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();
|
default: return node_iterator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -130,7 +130,7 @@ namespace YAML
|
|||||||
|
|
||||||
switch(m_type) {
|
switch(m_type) {
|
||||||
case NodeType::Sequence: return const_node_iterator(m_sequence.end());
|
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();
|
default: return const_node_iterator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ namespace YAML
|
|||||||
|
|
||||||
switch(m_type) {
|
switch(m_type) {
|
||||||
case NodeType::Sequence: return node_iterator(m_sequence.end());
|
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();
|
default: return node_iterator();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user