Merge pull request #563 from biojppm/fix/562_noderef_cend

NodeRef: fix bug in cend()
This commit is contained in:
jpmag
2025-12-17 15:51:21 +00:00
committed by GitHub
3 changed files with 123 additions and 1 deletions

View File

@@ -1,5 +1,6 @@
### Changes
- [PR#563](https://github.com/biojppm/rapidyaml/pull/563) (fixes [#562](https://github.com/biojppm/rapidyaml/issues/562)) - Fix bug in `NodeRef::cend()`
- [PR#547](https://github.com/biojppm/rapidyaml/pull/547) - Fix parsing of implicit first documents with empty sequences, caused by a problem in `Tree::set_root_as_stream()`:
```yaml
[] # this container was lost during parsing

View File

@@ -757,7 +757,7 @@ public:
/** get an iterator to after the last child */
C4_ALWAYS_INLINE const_iterator end() const RYML_NOEXCEPT { _C4RR(); return const_iterator(tree_, NONE); }
/** get an iterator to after the last child */
C4_ALWAYS_INLINE const_iterator cend() const RYML_NOEXCEPT { _C4RR(); return const_iterator(tree_, tree_->first_child(id_)); }
C4_ALWAYS_INLINE const_iterator cend() const RYML_NOEXCEPT { _C4RR(); return const_iterator(tree_, NONE); }
/** get an iterable view over children */
template<class U=Impl>

View File

@@ -1239,21 +1239,37 @@ TEST(NodeRef, overload_sets)
{
EXPECT_EQ(n["iseq"].cbegin().m_child_id, nc["iseq"].cbegin().m_child_id);
EXPECT_EQ(n["iseq"].cbegin().m_child_id, cn["iseq"].cbegin().m_child_id);
EXPECT_EQ(n["iseq"].cbegin().m_child_id, n["iseq"].begin().m_child_id);
EXPECT_EQ(nc["iseq"].cbegin().m_child_id, nc["iseq"].begin().m_child_id);
EXPECT_EQ(cn["iseq"].cbegin().m_child_id, cn["iseq"].begin().m_child_id);
}
// cend()
{
EXPECT_EQ(n["iseq"].cend().m_child_id, nc["iseq"].cend().m_child_id);
EXPECT_EQ(n["iseq"].cend().m_child_id, cn["iseq"].cend().m_child_id);
EXPECT_EQ(n["iseq"].cend().m_child_id, n["iseq"].end().m_child_id);
EXPECT_EQ(nc["iseq"].cend().m_child_id, nc["iseq"].end().m_child_id);
EXPECT_EQ(cn["iseq"].cend().m_child_id, cn["iseq"].end().m_child_id);
}
// children()
{
EXPECT_EQ(n["iseq"].children().b.m_child_id, nc["iseq"].children().b.m_child_id);
EXPECT_EQ(n["iseq"].children().b.m_child_id, cn["iseq"].children().b.m_child_id);
EXPECT_EQ(n["iseq"].children().e.m_child_id, nc["iseq"].children().e.m_child_id);
EXPECT_EQ(n["iseq"].children().e.m_child_id, cn["iseq"].children().e.m_child_id);
}
// cchildren()
{
EXPECT_EQ(n["iseq"].cchildren().b.m_child_id, nc["iseq"].cchildren().b.m_child_id);
EXPECT_EQ(n["iseq"].cchildren().b.m_child_id, cn["iseq"].cchildren().b.m_child_id);
EXPECT_EQ(n["iseq"].cchildren().b.m_child_id, n["iseq"].children().b.m_child_id);
EXPECT_EQ(nc["iseq"].cchildren().b.m_child_id, nc["iseq"].children().b.m_child_id);
EXPECT_EQ(cn["iseq"].cchildren().b.m_child_id, cn["iseq"].children().b.m_child_id);
EXPECT_EQ(n["iseq"].cchildren().e.m_child_id, nc["iseq"].cchildren().e.m_child_id);
EXPECT_EQ(n["iseq"].cchildren().e.m_child_id, cn["iseq"].cchildren().e.m_child_id);
EXPECT_EQ(n["iseq"].cchildren().e.m_child_id, n["iseq"].children().e.m_child_id);
EXPECT_EQ(nc["iseq"].cchildren().e.m_child_id, nc["iseq"].children().e.m_child_id);
EXPECT_EQ(cn["iseq"].cchildren().e.m_child_id, cn["iseq"].children().e.m_child_id);
}
// siblings()
{
@@ -1261,6 +1277,10 @@ TEST(NodeRef, overload_sets)
EXPECT_EQ(n["iseq"][0].siblings().b.m_child_id, cn["iseq"][0].siblings().b.m_child_id);
EXPECT_EQ(n.siblings().b.m_child_id, nc.siblings().b.m_child_id);
EXPECT_EQ(n.siblings().b.m_child_id, cn.siblings().b.m_child_id);
EXPECT_EQ(n["iseq"][0].siblings().e.m_child_id, nc["iseq"][0].siblings().e.m_child_id);
EXPECT_EQ(n["iseq"][0].siblings().e.m_child_id, cn["iseq"][0].siblings().e.m_child_id);
EXPECT_EQ(n.siblings().e.m_child_id, nc.siblings().e.m_child_id);
EXPECT_EQ(n.siblings().e.m_child_id, cn.siblings().e.m_child_id);
}
// csiblings()
{
@@ -1268,6 +1288,107 @@ TEST(NodeRef, overload_sets)
EXPECT_EQ(n["iseq"][0].csiblings().b.m_child_id, cn["iseq"][0].csiblings().b.m_child_id);
EXPECT_EQ(n.csiblings().b.m_child_id, nc.csiblings().b.m_child_id);
EXPECT_EQ(n.csiblings().b.m_child_id, cn.csiblings().b.m_child_id);
EXPECT_EQ(n["iseq"][0].csiblings().e.m_child_id, nc["iseq"][0].csiblings().e.m_child_id);
EXPECT_EQ(n["iseq"][0].csiblings().e.m_child_id, cn["iseq"][0].csiblings().e.m_child_id);
EXPECT_EQ(n.csiblings().e.m_child_id, nc.csiblings().e.m_child_id);
EXPECT_EQ(n.csiblings().e.m_child_id, cn.csiblings().e.m_child_id);
EXPECT_EQ(n["iseq"][0].csiblings().b.m_child_id, n["iseq"][0].siblings().b.m_child_id);
EXPECT_EQ(cn["iseq"][0].csiblings().b.m_child_id, cn["iseq"][0].siblings().b.m_child_id);
EXPECT_EQ(nc["iseq"][0].csiblings().b.m_child_id, nc["iseq"][0].siblings().b.m_child_id);
EXPECT_EQ(n.csiblings().b.m_child_id, n.siblings().b.m_child_id);
EXPECT_EQ(nc.csiblings().b.m_child_id, nc.siblings().b.m_child_id);
EXPECT_EQ(cn.csiblings().b.m_child_id, cn.siblings().b.m_child_id);
EXPECT_EQ(n["iseq"][0].csiblings().e.m_child_id, n["iseq"][0].siblings().e.m_child_id);
EXPECT_EQ(nc["iseq"][0].csiblings().e.m_child_id, nc["iseq"][0].siblings().e.m_child_id);
EXPECT_EQ(cn["iseq"][0].csiblings().e.m_child_id, cn["iseq"][0].siblings().e.m_child_id);
EXPECT_EQ(n.csiblings().e.m_child_id, n.siblings().e.m_child_id);
EXPECT_EQ(nc.csiblings().e.m_child_id, nc.siblings().e.m_child_id);
EXPECT_EQ(cn.csiblings().e.m_child_id, cn.siblings().e.m_child_id);
}
// iter begin-end
const std::vector<csubstr> expected = {"8", "10"};
{
{
std::vector<csubstr> actual;
for(auto it = n["iseq"].begin(); it != n["iseq"].end(); ++it)
actual.push_back((*it).val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto it = nc["iseq"].begin(); it != nc["iseq"].end(); ++it)
actual.push_back((*it).val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto it = cn["iseq"].begin(); it != cn["iseq"].end(); ++it)
actual.push_back((*it).val());
EXPECT_EQ(expected, actual);
}
}
// iter cbegin-cend
{
{
std::vector<csubstr> actual;
for(auto it = n["iseq"].cbegin(); it != n["iseq"].cend(); ++it)
actual.push_back((*it).val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto it = nc["iseq"].cbegin(); it != nc["iseq"].cend(); ++it)
actual.push_back((*it).val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto it = cn["iseq"].cbegin(); it != cn["iseq"].cend(); ++it)
actual.push_back((*it).val());
EXPECT_EQ(expected, actual);
}
}
// iter children
{
{
std::vector<csubstr> actual;
for(auto r : n["iseq"].children())
actual.push_back(r.val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto r : n["iseq"].children())
actual.push_back(r.val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto r : n["iseq"].children())
actual.push_back(r.val());
EXPECT_EQ(expected, actual);
}
}
// iter cchildren
{
{
std::vector<csubstr> actual;
for(auto r : n["iseq"].cchildren())
actual.push_back(r.val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto r : n["iseq"].cchildren())
actual.push_back(r.val());
EXPECT_EQ(expected, actual);
}
{
std::vector<csubstr> actual;
for(auto r : n["iseq"].cchildren())
actual.push_back(r.val());
EXPECT_EQ(expected, actual);
}
}
}