Fixed node iterator

This commit is contained in:
Jesse Beder
2011-09-10 14:36:10 -05:00
parent c3b0ba9d61
commit 5012063143
4 changed files with 22 additions and 12 deletions

View File

@@ -47,9 +47,9 @@ namespace YAML
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();
if(v.pNode) if(v.pNode)
return value_type(Value(*v.pNode, m_pMemory)); return value_type(Value(*v, m_pMemory));
if(v.pKey && v.pValue) if(v.first && v.second)
return value_type(Value(*v.pKey, m_pMemory), Value(*v.pValue, m_pMemory)); return value_type(Value(*v.first, m_pMemory), Value(*v.second, m_pMemory));
return value_type(); return value_type();
} }

View File

@@ -21,13 +21,17 @@ namespace YAML
struct iterator_type { enum value { None, Sequence, Map }; }; struct iterator_type { enum value { None, Sequence, Map }; };
template<typename V> template<typename V>
struct node_iterator_value { struct node_iterator_value: public std::pair<V*, V*> {
node_iterator_value(): pNode(0), pKey(0), pValue(0) {} typedef std::pair<V*, V*> kv;
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) {} 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 *pNode;
V *pKey, *pValue;
}; };
typedef std::vector<node *> node_seq; typedef std::vector<node *> node_seq;

View File

@@ -1,4 +1,5 @@
#include "valueevents.h" #include "valueevents.h"
#include "yaml-cpp/value.h"
namespace YAML namespace YAML
{ {
@@ -7,7 +8,7 @@ namespace YAML
Visit(m_root); Visit(m_root);
} }
void Visit(detail::node& node) void ValueEvents::Visit(const detail::node& node)
{ {
int& refCount = m_refCount[node.ref()]; int& refCount = m_refCount[node.ref()];
refCount++; refCount++;
@@ -15,8 +16,13 @@ namespace YAML
return; return;
if(node.type() == ValueType::Sequence) { 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) { } else if(node.type() == ValueType::Map) {
for(detail::const_node_iterator it=node.begin();it!=node.end();++it) {
Visit(*it->first);
Visit(*it->second);
}
} }
} }
} }

View File

@@ -7,7 +7,7 @@
#include "yaml-cpp/anchor.h" #include "yaml-cpp/anchor.h"
#include "yaml-cpp/value/ptr.h" #include "yaml-cpp/value/ptr.h"
#include <multiset> #include <map>
#include <vector> #include <vector>
namespace YAML namespace YAML
@@ -20,7 +20,7 @@ namespace YAML
ValueEvents(const Value& value); ValueEvents(const Value& value);
private: private:
void Visit(detail::node& node); void Visit(const detail::node& node);
private: private:
detail::shared_memory_holder m_pMemory; detail::shared_memory_holder m_pMemory;