Permalink
Browse files

Fix sequence sometimes not turning into a map (#450)

Previously, just referencing the next element in the sequence (and so constructing it, as an undefined element) would allow you to skip defining an element without turning the sequence into a map. E.g:

node[0] = "foo"; // sequence of size 1
node[1]; // sequence of size 1, with an undefined element at 1
node[2] = "bar"; // FIX: should be map of size 2 (since there's no element at index 1)
  • Loading branch information...
1 parent 3757b20 commit f82861001a6535626e3f695aa0f96e720fb33a45 @butataatawa butataatawa committed with Jan 2, 2017
Showing with 13 additions and 2 deletions.
  1. +1 −1 include/yaml-cpp/node/detail/impl.h
  2. +12 −1 test/node/node_test.cpp
@@ -32,7 +32,7 @@ struct get_idx<Key,
static node* get(std::vector<node*>& sequence, const Key& key,
shared_memory_holder pMemory) {
- if (key > sequence.size())
+ if (key > sequence.size() || (key > 0 && !sequence[key-1]->is_defined()))
return 0;
if (key == sequence.size())
sequence.push_back(&pMemory->create_node());
@@ -88,11 +88,22 @@ TEST(NodeTest, MapWithUndefinedValues) {
EXPECT_EQ(2, node.size());
}
+TEST(NodeTest, SeqIntoMap) {
+ Node node;
+ node[0] = "test";
+ node[1];
+ node[2] = "value";
+ EXPECT_TRUE(node.IsMap());
+ EXPECT_EQ("test", node[0].as<std::string>());
+ EXPECT_EQ("value", node[2].as<std::string>());
+ EXPECT_EQ(2, node.size());
+}
+
TEST(NodeTest, RemoveUnassignedNode) {
Node node(NodeType::Map);
node["key"];
node.remove("key");
- EXPECT_EQ(node.size(), 0);
+ EXPECT_EQ(0, node.size());
}
TEST(NodeTest, MapForceInsert) {

0 comments on commit f828610

Please sign in to comment.