squash/revert: fix memory merging

This commit is contained in:
Hannes Janetzek 2016-12-11 19:11:02 +01:00
parent 5e5e33a709
commit 49a56a1bcd
3 changed files with 24 additions and 6 deletions

View File

@ -35,7 +35,25 @@ class YAML_CPP_API memory : public ref_counted {
Nodes m_nodes;
};
typedef ref_holder<memory> shared_memory;
struct memory_ref : ref_counted {
ref_holder<memory> m_ptr;
memory_ref() : m_ptr(new memory) {}
~memory_ref() {}
node& create_node() { return m_ptr->create_node(); }
void merge(memory_ref& rhs) {
if (m_ptr == rhs.m_ptr) {
return;
}
m_ptr->merge(*rhs.m_ptr);
rhs.m_ptr = m_ptr;
};
};
typedef ref_holder<memory_ref> shared_memory;
}
}

View File

@ -15,17 +15,17 @@
#include <string>
namespace YAML {
inline Node::Node() : m_pMemory(new detail::memory), m_pNode(NULL) {}
inline Node::Node() : m_pMemory(new detail::memory_ref), m_pNode(NULL) {}
inline Node::Node(NodeType::value type)
: m_pMemory(new detail::memory),
: m_pMemory(new detail::memory_ref),
m_pNode(&(m_pMemory->create_node())) {
m_pNode->set_type(type);
}
template <typename T>
inline Node::Node(const T& rhs)
: m_pMemory(new detail::memory),
: m_pMemory(new detail::memory_ref),
m_pNode(&(m_pMemory->create_node())) {
Assign(rhs);
}
@ -52,7 +52,7 @@ inline void Node::EnsureNodeExists() const {
if (!isValid())
throw InvalidNode();
if (!m_pNode) {
m_pMemory.reset(new detail::memory);
m_pMemory.reset(new detail::memory_ref);
m_pNode = &m_pMemory->create_node();
m_pNode->set_null();
}

View File

@ -11,7 +11,7 @@ namespace YAML {
struct Mark;
NodeBuilder::NodeBuilder()
: m_pMemory(new detail::memory), m_pRoot(0), m_mapDepth(0) {
: m_pMemory(new detail::memory_ref), m_pRoot(0), m_mapDepth(0) {
m_anchors.push_back(0); // since the anchors start at 1
}