mirror of
https://github.com/jbeder/yaml-cpp.git
synced 2025-09-09 12:41:17 +00:00
Fix Node::size() after removing node from sequence (#820)
This commit is contained in:
@@ -58,7 +58,9 @@ struct get_idx<Key, typename std::enable_if<std::is_signed<Key>::value>::type> {
|
|||||||
|
|
||||||
template <typename Key, typename Enable = void>
|
template <typename Key, typename Enable = void>
|
||||||
struct remove_idx {
|
struct remove_idx {
|
||||||
static bool remove(std::vector<node*>&, const Key&) { return false; }
|
static bool remove(std::vector<node*>&, const Key&, std::size_t&) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename Key>
|
template <typename Key>
|
||||||
@@ -66,11 +68,15 @@ struct remove_idx<
|
|||||||
Key, typename std::enable_if<std::is_unsigned<Key>::value &&
|
Key, typename std::enable_if<std::is_unsigned<Key>::value &&
|
||||||
!std::is_same<Key, bool>::value>::type> {
|
!std::is_same<Key, bool>::value>::type> {
|
||||||
|
|
||||||
static bool remove(std::vector<node*>& sequence, const Key& key) {
|
static bool remove(std::vector<node*>& sequence, const Key& key,
|
||||||
|
std::size_t& seqSize) {
|
||||||
if (key >= sequence.size()) {
|
if (key >= sequence.size()) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
sequence.erase(sequence.begin() + key);
|
sequence.erase(sequence.begin() + key);
|
||||||
|
if (seqSize > key) {
|
||||||
|
--seqSize;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -80,9 +86,10 @@ template <typename Key>
|
|||||||
struct remove_idx<Key,
|
struct remove_idx<Key,
|
||||||
typename std::enable_if<std::is_signed<Key>::value>::type> {
|
typename std::enable_if<std::is_signed<Key>::value>::type> {
|
||||||
|
|
||||||
static bool remove(std::vector<node*>& sequence, const Key& key) {
|
static bool remove(std::vector<node*>& sequence, const Key& key,
|
||||||
|
std::size_t& seqSize) {
|
||||||
return key >= 0 ? remove_idx<std::size_t>::remove(
|
return key >= 0 ? remove_idx<std::size_t>::remove(
|
||||||
sequence, static_cast<std::size_t>(key))
|
sequence, static_cast<std::size_t>(key), seqSize)
|
||||||
: false;
|
: false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -161,7 +168,7 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
|
|||||||
template <typename Key>
|
template <typename Key>
|
||||||
inline bool node_data::remove(const Key& key, shared_memory_holder pMemory) {
|
inline bool node_data::remove(const Key& key, shared_memory_holder pMemory) {
|
||||||
if (m_type == NodeType::Sequence) {
|
if (m_type == NodeType::Sequence) {
|
||||||
return remove_idx<Key>::remove(m_sequence, key);
|
return remove_idx<Key>::remove(m_sequence, key, m_seqSize);
|
||||||
} else if (m_type == NodeType::Map) {
|
} else if (m_type == NodeType::Map) {
|
||||||
kv_pairs::iterator it = m_undefinedPairs.begin();
|
kv_pairs::iterator it = m_undefinedPairs.begin();
|
||||||
while (it != m_undefinedPairs.end()) {
|
while (it != m_undefinedPairs.end()) {
|
||||||
|
@@ -59,6 +59,19 @@ TEST(NodeTest, SequenceElementRemoval) {
|
|||||||
EXPECT_EQ("c", node[1].as<std::string>());
|
EXPECT_EQ("c", node[1].as<std::string>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(NodeTest, SequenceElementRemovalSizeCheck) {
|
||||||
|
Node node;
|
||||||
|
node[0] = "a";
|
||||||
|
node[1] = "b";
|
||||||
|
node[2] = "c";
|
||||||
|
EXPECT_EQ(3, node.size());
|
||||||
|
node.remove(1);
|
||||||
|
EXPECT_TRUE(node.IsSequence());
|
||||||
|
EXPECT_EQ(2, node.size());
|
||||||
|
EXPECT_EQ("a", node[0].as<std::string>());
|
||||||
|
EXPECT_EQ("c", node[1].as<std::string>());
|
||||||
|
}
|
||||||
|
|
||||||
TEST(NodeTest, SequenceFirstElementRemoval) {
|
TEST(NodeTest, SequenceFirstElementRemoval) {
|
||||||
Node node;
|
Node node;
|
||||||
node[0] = "a";
|
node[0] = "a";
|
||||||
@@ -71,6 +84,19 @@ TEST(NodeTest, SequenceFirstElementRemoval) {
|
|||||||
EXPECT_EQ("c", node[1].as<std::string>());
|
EXPECT_EQ("c", node[1].as<std::string>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(NodeTest, SequenceFirstElementRemovalSizeCheck) {
|
||||||
|
Node node;
|
||||||
|
node[0] = "a";
|
||||||
|
node[1] = "b";
|
||||||
|
node[2] = "c";
|
||||||
|
EXPECT_EQ(3, node.size());
|
||||||
|
node.remove(0);
|
||||||
|
EXPECT_TRUE(node.IsSequence());
|
||||||
|
EXPECT_EQ(2, node.size());
|
||||||
|
EXPECT_EQ("b", node[0].as<std::string>());
|
||||||
|
EXPECT_EQ("c", node[1].as<std::string>());
|
||||||
|
}
|
||||||
|
|
||||||
TEST(NodeTest, SequenceLastElementRemoval) {
|
TEST(NodeTest, SequenceLastElementRemoval) {
|
||||||
Node node;
|
Node node;
|
||||||
node[0] = "a";
|
node[0] = "a";
|
||||||
@@ -83,6 +109,19 @@ TEST(NodeTest, SequenceLastElementRemoval) {
|
|||||||
EXPECT_EQ("b", node[1].as<std::string>());
|
EXPECT_EQ("b", node[1].as<std::string>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(NodeTest, SequenceLastElementRemovalSizeCheck) {
|
||||||
|
Node node;
|
||||||
|
node[0] = "a";
|
||||||
|
node[1] = "b";
|
||||||
|
node[2] = "c";
|
||||||
|
EXPECT_EQ(3, node.size());
|
||||||
|
node.remove(2);
|
||||||
|
EXPECT_TRUE(node.IsSequence());
|
||||||
|
EXPECT_EQ(2, node.size());
|
||||||
|
EXPECT_EQ("a", node[0].as<std::string>());
|
||||||
|
EXPECT_EQ("b", node[1].as<std::string>());
|
||||||
|
}
|
||||||
|
|
||||||
TEST(NodeTest, NodeAssignment) {
|
TEST(NodeTest, NodeAssignment) {
|
||||||
Node node1;
|
Node node1;
|
||||||
Node node2;
|
Node node2;
|
||||||
|
Reference in New Issue
Block a user