From 4329bb7c02631ae5762bf36cf3192b45d0fe6030 Mon Sep 17 00:00:00 2001 From: butataatawa Date: Sat, 18 Feb 2017 13:34:42 +0100 Subject: [PATCH] Fix inconsistent Node::size when removing a key with unassigned node and key is a node (#327) --- src/node_data.cpp | 8 ++++++++ test/node/node_test.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/node_data.cpp b/src/node_data.cpp index 77cd465..2dfcd7b 100644 --- a/src/node_data.cpp +++ b/src/node_data.cpp @@ -235,6 +235,14 @@ bool node_data::remove(node& key, shared_memory_holder /* pMemory */) { if (m_type != NodeType::Map) return false; + kv_pairs::iterator it = m_undefinedPairs.begin(); + while (it != m_undefinedPairs.end()) { + kv_pairs::iterator jt = std::next(it); + if (it->first->is(key)) + m_undefinedPairs.erase(it); + it = jt; + } + for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) { if (it->first->is(key)) { m_map.erase(it); diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index 485ad09..dd852f0 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -106,6 +106,14 @@ TEST(NodeTest, RemoveUnassignedNode) { EXPECT_EQ(0, node.size()); } +TEST(NodeTest, RemoveUnassignedNodeFromMap) { + Node node(NodeType::Map); + Node n; + node[n]; + node.remove(n); + EXPECT_EQ(0, node.size()); +} + TEST(NodeTest, MapForceInsert) { Node node; Node k1("k1");