squash/revert: fix memory merging
This commit is contained in:
parent
5e5e33a709
commit
49a56a1bcd
@ -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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user