Commit 14955a2a authored by beder's avatar beder
Browse files

Set the pimpl node in Node to be optional, so we don't create unnecessary guys...

Set the pimpl node in Node to be optional, so we don't create unnecessary guys every time you call Node tmp = foo[value];
parent a2aa5a2f
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
namespace YAML namespace YAML
{ {
inline Node::Node(): m_pMemory(new detail::memory_holder), m_pNode(&m_pMemory->create_node()) inline Node::Node(): m_pNode(0)
{ {
} }
...@@ -41,15 +41,27 @@ namespace YAML ...@@ -41,15 +41,27 @@ namespace YAML
{ {
} }
inline void Node::EnsureNodeExists() const
{
if(!m_pNode) {
m_pMemory.reset(new detail::memory_holder);
m_pNode = &m_pMemory->create_node();
m_pNode->set_null();
}
}
inline NodeType::value Node::Type() const inline NodeType::value Node::Type() const
{ {
return m_pNode->type(); return m_pNode ? m_pNode->type() : NodeType::Null;
} }
// access // access
template<typename T> template<typename T>
inline const T Node::as() const inline const T Node::as() const
{ {
if(!m_pNode)
throw std::runtime_error("Unable to convert to type");
T t; T t;
if(convert<T>::decode(*this, t)) if(convert<T>::decode(*this, t))
return t; return t;
...@@ -66,13 +78,13 @@ namespace YAML ...@@ -66,13 +78,13 @@ namespace YAML
inline const std::string& Node::scalar() const inline const std::string& Node::scalar() const
{ {
return m_pNode->scalar(); return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar;
} }
// assignment // assignment
inline bool Node::is(const Node& rhs) const inline bool Node::is(const Node& rhs) const
{ {
return m_pNode->is(*rhs.m_pNode); return m_pNode ? m_pNode->is(*rhs.m_pNode) : false;
} }
template<typename T> template<typename T>
...@@ -91,16 +103,19 @@ namespace YAML ...@@ -91,16 +103,19 @@ namespace YAML
template<> template<>
inline void Node::Assign(const std::string& rhs) inline void Node::Assign(const std::string& rhs)
{ {
EnsureNodeExists();
m_pNode->set_scalar(rhs); m_pNode->set_scalar(rhs);
} }
inline void Node::Assign(const char *rhs) inline void Node::Assign(const char *rhs)
{ {
EnsureNodeExists();
m_pNode->set_scalar(rhs); m_pNode->set_scalar(rhs);
} }
inline void Node::Assign(char *rhs) inline void Node::Assign(char *rhs)
{ {
EnsureNodeExists();
m_pNode->set_scalar(rhs); m_pNode->set_scalar(rhs);
} }
...@@ -114,12 +129,18 @@ namespace YAML ...@@ -114,12 +129,18 @@ namespace YAML
inline void Node::AssignData(const Node& rhs) inline void Node::AssignData(const Node& rhs)
{ {
EnsureNodeExists();
rhs.EnsureNodeExists();
m_pNode->set_data(*rhs.m_pNode); m_pNode->set_data(*rhs.m_pNode);
m_pMemory->merge(*rhs.m_pMemory); m_pMemory->merge(*rhs.m_pMemory);
} }
inline void Node::AssignNode(const Node& rhs) inline void Node::AssignNode(const Node& rhs)
{ {
EnsureNodeExists();
rhs.EnsureNodeExists();
m_pNode->set_ref(*rhs.m_pNode); m_pNode->set_ref(*rhs.m_pNode);
m_pMemory->merge(*rhs.m_pMemory); m_pMemory->merge(*rhs.m_pMemory);
m_pNode = rhs.m_pNode; m_pNode = rhs.m_pNode;
...@@ -128,27 +149,27 @@ namespace YAML ...@@ -128,27 +149,27 @@ namespace YAML
// size/iterator // size/iterator
inline std::size_t Node::size() const inline std::size_t Node::size() const
{ {
return m_pNode->size(); return m_pNode ? m_pNode->size() : 0;
} }
inline const_iterator Node::begin() const inline const_iterator Node::begin() const
{ {
return const_iterator(m_pNode->begin(), m_pMemory); return m_pNode ? const_iterator(m_pNode->begin(), m_pMemory) : const_iterator();
} }
inline iterator Node::begin() inline iterator Node::begin()
{ {
return iterator(m_pNode->begin(), m_pMemory); return m_pNode ? iterator(m_pNode->begin(), m_pMemory) : iterator();
} }
inline const_iterator Node::end() const inline const_iterator Node::end() const
{ {
return const_iterator(m_pNode->end(), m_pMemory); return m_pNode ? const_iterator(m_pNode->end(), m_pMemory) : const_iterator();
} }
inline iterator Node::end() inline iterator Node::end()
{ {
return iterator(m_pNode->end(), m_pMemory); return m_pNode ? iterator(m_pNode->end(), m_pMemory) : iterator();
} }
// sequence // sequence
...@@ -160,6 +181,9 @@ namespace YAML ...@@ -160,6 +181,9 @@ namespace YAML
inline void Node::append(const Node& rhs) inline void Node::append(const Node& rhs)
{ {
EnsureNodeExists();
rhs.EnsureNodeExists();
m_pNode->append(*rhs.m_pNode, m_pMemory); m_pNode->append(*rhs.m_pNode, m_pMemory);
m_pMemory->merge(*rhs.m_pMemory); m_pMemory->merge(*rhs.m_pMemory);
} }
...@@ -168,6 +192,7 @@ namespace YAML ...@@ -168,6 +192,7 @@ namespace YAML
template<typename Key> template<typename Key>
inline const Node Node::operator[](const Key& key) const inline const Node Node::operator[](const Key& key) const
{ {
EnsureNodeExists();
detail::node& value = static_cast<const detail::node&>(*m_pNode).get(key, m_pMemory); detail::node& value = static_cast<const detail::node&>(*m_pNode).get(key, m_pMemory);
return Node(value, m_pMemory); return Node(value, m_pMemory);
} }
...@@ -175,6 +200,7 @@ namespace YAML ...@@ -175,6 +200,7 @@ namespace YAML
template<typename Key> template<typename Key>
inline Node Node::operator[](const Key& key) inline Node Node::operator[](const Key& key)
{ {
EnsureNodeExists();
detail::node& value = m_pNode->get(key, m_pMemory); detail::node& value = m_pNode->get(key, m_pMemory);
return Node(value, m_pMemory); return Node(value, m_pMemory);
} }
...@@ -182,23 +208,30 @@ namespace YAML ...@@ -182,23 +208,30 @@ namespace YAML
template<typename Key> template<typename Key>
inline bool Node::remove(const Key& key) inline bool Node::remove(const Key& key)
{ {
EnsureNodeExists();
return m_pNode->remove(key, m_pMemory); return m_pNode->remove(key, m_pMemory);
} }
inline const Node Node::operator[](const Node& key) const inline const Node Node::operator[](const Node& key) const
{ {
EnsureNodeExists();
key.EnsureNodeExists();
detail::node& value = static_cast<const detail::node&>(*m_pNode).get(*key.m_pNode, m_pMemory); detail::node& value = static_cast<const detail::node&>(*m_pNode).get(*key.m_pNode, m_pMemory);
return Node(value, m_pMemory); return Node(value, m_pMemory);
} }
inline Node Node::operator[](const Node& key) inline Node Node::operator[](const Node& key)
{ {
EnsureNodeExists();
key.EnsureNodeExists();
detail::node& value = m_pNode->get(*key.m_pNode, m_pMemory); detail::node& value = m_pNode->get(*key.m_pNode, m_pMemory);
return Node(value, m_pMemory); return Node(value, m_pMemory);
} }
inline bool Node::remove(const Node& key) inline bool Node::remove(const Node& key)
{ {
EnsureNodeExists();
key.EnsureNodeExists();
return m_pNode->remove(*key.m_pNode, m_pMemory); return m_pNode->remove(*key.m_pNode, m_pMemory);
} }
......
...@@ -72,6 +72,8 @@ namespace YAML ...@@ -72,6 +72,8 @@ namespace YAML
private: private:
explicit Node(detail::node& node, detail::shared_memory_holder pMemory); explicit Node(detail::node& node, detail::shared_memory_holder pMemory);
void EnsureNodeExists() const;
template<typename T> void Assign(const T& rhs); template<typename T> void Assign(const T& rhs);
void Assign(const char *rhs); void Assign(const char *rhs);
void Assign(char *rhs); void Assign(char *rhs);
...@@ -80,8 +82,8 @@ namespace YAML ...@@ -80,8 +82,8 @@ namespace YAML
void AssignNode(const Node& rhs); void AssignNode(const Node& rhs);
private: private:
detail::shared_memory_holder m_pMemory; mutable detail::shared_memory_holder m_pMemory;
detail::node *m_pNode; mutable detail::node *m_pNode;
}; };
bool operator==(const Node& lhs, const Node& rhs); bool operator==(const Node& lhs, const Node& rhs);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment