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

View File

@ -11,7 +11,7 @@ namespace YAML {
struct Mark; struct Mark;
NodeBuilder::NodeBuilder() 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 m_anchors.push_back(0); // since the anchors start at 1
} }