From b3086ac2606d4b6999788f7faf06afa30406e44e Mon Sep 17 00:00:00 2001 From: beder Date: Sat, 10 Sep 2011 14:36:10 -0500 Subject: [PATCH] Fixed node iterator --- include/yaml-cpp/value/detail/iterator.h | 6 +++--- include/yaml-cpp/value/detail/node_iterator.h | 14 +++++++++----- src/value/valueevents.cpp | 10 ++++++++-- src/value/valueevents.h | 4 ++-- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/include/yaml-cpp/value/detail/iterator.h b/include/yaml-cpp/value/detail/iterator.h index c4b1564..bbbd8bb 100644 --- a/include/yaml-cpp/value/detail/iterator.h +++ b/include/yaml-cpp/value/detail/iterator.h @@ -47,9 +47,9 @@ namespace YAML value_type dereference() const { const typename base_type::value_type& v = *this->base(); if(v.pNode) - return value_type(Value(*v.pNode, m_pMemory)); - if(v.pKey && v.pValue) - return value_type(Value(*v.pKey, m_pMemory), Value(*v.pValue, m_pMemory)); + return value_type(Value(*v, m_pMemory)); + if(v.first && v.second) + return value_type(Value(*v.first, m_pMemory), Value(*v.second, m_pMemory)); return value_type(); } diff --git a/include/yaml-cpp/value/detail/node_iterator.h b/include/yaml-cpp/value/detail/node_iterator.h index a3a3ac3..3aab2ec 100644 --- a/include/yaml-cpp/value/detail/node_iterator.h +++ b/include/yaml-cpp/value/detail/node_iterator.h @@ -21,13 +21,17 @@ namespace YAML struct iterator_type { enum value { None, Sequence, Map }; }; template - struct node_iterator_value { - node_iterator_value(): pNode(0), pKey(0), pValue(0) {} - explicit node_iterator_value(V& rhs): pNode(&rhs), pKey(0), pValue(0) {} - explicit node_iterator_value(V& key, V& value): pNode(0), pKey(&key), pValue(&value) {} + struct node_iterator_value: public std::pair { + typedef std::pair kv; + + node_iterator_value(): kv(), pNode(0) {} + explicit node_iterator_value(V& rhs): kv(), pNode(&rhs) {} + explicit node_iterator_value(V& key, V& value): kv(&key, &value), pNode(0) {} + + V& operator *() const { return *pNode; } + V& operator ->() const { return *pNode; } V *pNode; - V *pKey, *pValue; }; typedef std::vector node_seq; diff --git a/src/value/valueevents.cpp b/src/value/valueevents.cpp index a5f512f..877eb16 100644 --- a/src/value/valueevents.cpp +++ b/src/value/valueevents.cpp @@ -1,4 +1,5 @@ #include "valueevents.h" +#include "yaml-cpp/value.h" namespace YAML { @@ -7,7 +8,7 @@ namespace YAML Visit(m_root); } - void Visit(detail::node& node) + void ValueEvents::Visit(const detail::node& node) { int& refCount = m_refCount[node.ref()]; refCount++; @@ -15,8 +16,13 @@ namespace YAML return; if(node.type() == ValueType::Sequence) { - + for(detail::const_node_iterator it=node.begin();it!=node.end();++it) + Visit(**it); } else if(node.type() == ValueType::Map) { + for(detail::const_node_iterator it=node.begin();it!=node.end();++it) { + Visit(*it->first); + Visit(*it->second); + } } } } diff --git a/src/value/valueevents.h b/src/value/valueevents.h index 15846bf..9273c67 100644 --- a/src/value/valueevents.h +++ b/src/value/valueevents.h @@ -7,7 +7,7 @@ #include "yaml-cpp/anchor.h" #include "yaml-cpp/value/ptr.h" -#include +#include #include namespace YAML @@ -20,7 +20,7 @@ namespace YAML ValueEvents(const Value& value); private: - void Visit(detail::node& node); + void Visit(const detail::node& node); private: detail::shared_memory_holder m_pMemory;