From 49a56a1bcd25b9a93237375dd2de6d6545aa2887 Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Sun, 11 Dec 2016 19:11:02 +0100 Subject: [PATCH] squash/revert: fix memory merging --- include/yaml-cpp/node/detail/memory.h | 20 +++++++++++++++++++- include/yaml-cpp/node/impl.h | 8 ++++---- src/nodebuilder.cpp | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/yaml-cpp/node/detail/memory.h b/include/yaml-cpp/node/detail/memory.h index 4697d0c..f105588 100644 --- a/include/yaml-cpp/node/detail/memory.h +++ b/include/yaml-cpp/node/detail/memory.h @@ -35,7 +35,25 @@ class YAML_CPP_API memory : public ref_counted { Nodes m_nodes; }; -typedef ref_holder shared_memory; +struct memory_ref : ref_counted { + + ref_holder 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 shared_memory; } } diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h index ddcf75c..5f302cf 100644 --- a/include/yaml-cpp/node/impl.h +++ b/include/yaml-cpp/node/impl.h @@ -15,17 +15,17 @@ #include 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 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(); } diff --git a/src/nodebuilder.cpp b/src/nodebuilder.cpp index 41f52e4..6138ebb 100644 --- a/src/nodebuilder.cpp +++ b/src/nodebuilder.cpp @@ -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 }