diff --git a/include/yaml-cpp/value/detail/node.h b/include/yaml-cpp/value/detail/node.h index 006f50c..f56ab1c 100644 --- a/include/yaml-cpp/value/detail/node.h +++ b/include/yaml-cpp/value/detail/node.h @@ -22,6 +22,8 @@ namespace YAML node(): m_pRef(new node_ref) {} bool is(const node& rhs) const { return m_pRef == rhs.m_pRef; } + const node_ref *ref() const { return m_pRef.get(); } + ValueType::value type() const { return m_pRef->type(); } const std::string& scalar() const { return m_pRef->scalar(); } diff --git a/include/yaml-cpp/value/value.h b/include/yaml-cpp/value/value.h index 5235bf4..8ef3218 100644 --- a/include/yaml-cpp/value/value.h +++ b/include/yaml-cpp/value/value.h @@ -18,6 +18,7 @@ namespace YAML { public: friend class ValueBuilder; + friend class ValueEvents; friend class detail::node_data; template friend class detail::iterator_base; diff --git a/src/value/valueevents.cpp b/src/value/valueevents.cpp new file mode 100644 index 0000000..a5f512f --- /dev/null +++ b/src/value/valueevents.cpp @@ -0,0 +1,22 @@ +#include "valueevents.h" + +namespace YAML +{ + ValueEvents::ValueEvents(const Value& value): m_pMemory(value.m_pMemory), m_root(*value.m_pNode) + { + Visit(m_root); + } + + void Visit(detail::node& node) + { + int& refCount = m_refCount[node.ref()]; + refCount++; + if(refCount > 1) + return; + + if(node.type() == ValueType::Sequence) { + + } else if(node.type() == ValueType::Map) { + } + } +} diff --git a/src/value/valueevents.h b/src/value/valueevents.h new file mode 100644 index 0000000..15846bf --- /dev/null +++ b/src/value/valueevents.h @@ -0,0 +1,35 @@ +#ifndef VALUE_VALUEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 +#define VALUE_VALUEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 + +#if defined(_MSC_VER) || (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4 +#pragma once +#endif + +#include "yaml-cpp/anchor.h" +#include "yaml-cpp/value/ptr.h" +#include +#include + +namespace YAML +{ + class Value; + + class ValueEvents + { + public: + ValueEvents(const Value& value); + + private: + void Visit(detail::node& node); + + private: + detail::shared_memory_holder m_pMemory; + detail::node& m_root; + + typedef std::map RefCount; + RefCount m_refCount; + }; +} + +#endif // VALUE_VALUEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 +