From 52cc604c3f7b1e055cd4a4ed4eac60a3e48f5f4d Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Thu, 24 Nov 2016 14:52:08 +0100 Subject: [PATCH] implement Node move --- include/yaml-cpp/node/impl.h | 19 +++++++++++++++++++ include/yaml-cpp/node/iterator.h | 19 ++++++++++++------- include/yaml-cpp/node/node.h | 3 +++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h index c302608..02cfe94 100644 --- a/include/yaml-cpp/node/impl.h +++ b/include/yaml-cpp/node/impl.h @@ -51,6 +51,14 @@ inline Node::Node(Zombie) m_pMemory(nullptr), m_pNode(NULL) {} +inline Node::Node(Node&& rhs) + : m_isValid(rhs.m_isValid), + m_pMemory(rhs.m_pMemory), // move ? + m_pNode(rhs.m_pNode) { + + rhs.m_pNode = nullptr; +} + inline Node::Node(detail::node& node, detail::shared_memory_holder pMemory) : m_isValid(true), m_pMemory(pMemory), @@ -256,6 +264,17 @@ inline Node& Node::operator=(const Node& rhs) { return *this; } +inline Node& Node::operator=(Node&& rhs) { + if (!m_isValid || !rhs.m_isValid) + throw InvalidNode(); + if (is(rhs)) + return *this; + + AssignNode(rhs); + + return *this; +} + inline void Node::AssignData(Node&& rhs) { if (!m_isValid || !rhs.m_isValid) throw InvalidNode(); diff --git a/include/yaml-cpp/node/iterator.h b/include/yaml-cpp/node/iterator.h index 26f6055..8d4a1ac 100644 --- a/include/yaml-cpp/node/iterator.h +++ b/include/yaml-cpp/node/iterator.h @@ -18,18 +18,23 @@ namespace YAML { namespace detail { struct iterator_value : public Node, std::pair { - iterator_value() {} + iterator_value() + : Node(Node::ZombieNode), + std::pair(Node(Node::ZombieNode), Node(Node::ZombieNode)) {} + explicit iterator_value(const Node& rhs) - : Node(rhs), - std::pair(Node(Node::ZombieNode), Node(Node::ZombieNode)) {} + : Node(rhs), + std::pair(Node(Node::ZombieNode), Node(Node::ZombieNode)) {} + explicit iterator_value(const Node& key, const Node& value) - : Node(Node::ZombieNode), std::pair(key, value) {} + : Node(Node::ZombieNode), std::pair(key, value) {} explicit iterator_value(Node&& rhs) - : Node(std::move(rhs)), - std::pair(Node(Node::ZombieNode), Node(Node::ZombieNode)) {} + : Node(std::move(rhs)), + std::pair(Node(Node::ZombieNode), Node(Node::ZombieNode)) {} + explicit iterator_value(Node&& key, Node&& value) - : Node(Node::ZombieNode), std::pair(std::move(key), std::move(value)) {} + : Node(Node::ZombieNode), std::pair(std::move(key), std::move(value)) {} }; } } diff --git a/include/yaml-cpp/node/node.h b/include/yaml-cpp/node/node.h index 768e0c8..865316a 100644 --- a/include/yaml-cpp/node/node.h +++ b/include/yaml-cpp/node/node.h @@ -47,6 +47,8 @@ class YAML_CPP_API Node { explicit Node(const T& rhs); explicit Node(const detail::iterator_value& rhs); Node(const Node& rhs); + Node(Node&& rhs); + ~Node(); YAML::Mark Mark() const; @@ -81,6 +83,7 @@ class YAML_CPP_API Node { template Node& operator=(const T& rhs); Node& operator=(const Node& rhs); + Node& operator=(Node&& rhs); void reset(const Node& rhs = Node()); // size/iterator