Skip to content

Commit 5e53b6d

Browse files
committed
[v2] squash with prev commit
1 parent 217e3c5 commit 5e53b6d

File tree

2 files changed

+56
-115
lines changed

2 files changed

+56
-115
lines changed

src/c4/yml/tree.cpp

+48-108
Original file line numberDiff line numberDiff line change
@@ -1282,124 +1282,90 @@ void Tree::merge_with(Tree const *src, size_t src_node, size_t dst_node)
12821282

12831283
//-----------------------------------------------------------------------------
12841284

1285-
bool Tree::is_subset_strview(Tree const *dst, size_t dst_node, size_t src_node)
1285+
bool Tree::has_all(Tree const* reftree, size_t refnode, size_t subject_node) const
12861286
{
1287-
return _is_subset_strview_init(dst, dst_node, src_node, false /* don't skip values */);
1288-
}
1287+
_RYML_CB_ASSERT(m_callbacks, reftree != nullptr);
1288+
if (subject_node == NONE)
1289+
subject_node = root_id();
1290+
if (refnode == NONE)
1291+
refnode = reftree->root_id();
12891292

1290-
bool Tree::is_subset_strview_skipval(Tree const *dst, size_t dst_node, size_t src_node)
1291-
{
1292-
return _is_subset_strview_init(dst, dst_node, src_node, true /* skip values */);
1293+
return _has_all_recursive(reftree, refnode, subject_node);
12931294
}
12941295

1295-
bool Tree::_is_subset_strview_init(Tree const *dst, size_t dst_node, size_t src_node, bool skip_val)
1296+
bool Tree::_has_all_recursive(Tree const* reftree, size_t refnode, size_t subject_node) const
12961297
{
1297-
_RYML_CB_ASSERT(m_callbacks, dst != nullptr);
1298-
if (src_node == NONE)
1299-
src_node = root_id();
1300-
if (dst_node == NONE)
1301-
dst_node = dst->root_id();
1302-
1303-
// guard against different types
1304-
if(!_is_subset_type_equal(dst, dst_node, src_node))
1305-
return false;
1306-
1307-
// stream
1308-
if (is_stream(src_node))
1298+
if (is_val(subject_node))
13091299
{
1310-
if (num_children(src_node) > dst->num_children(dst_node))
1300+
if( ! reftree->is_val(refnode))
13111301
return false;
1312-
1313-
size_t dch = dst->first_child(dst_node);
1314-
for (size_t sch = first_child(src_node); sch != NONE;sch = next_sibling(sch))
1315-
{
1316-
if (!_is_subset_strview_recursive(dst, dch, sch, skip_val))
1317-
return false;
1318-
dch = dst->next_sibling(dch);
1319-
}
1302+
// skip value comparison
13201303
return true;
13211304
}
1322-
else
1323-
{
1324-
return _is_subset_strview_recursive(dst, dst_node, src_node, skip_val);
1325-
}
1326-
}
1327-
1328-
bool Tree::_is_subset_strview_recursive(Tree const *dst, size_t dst_node, size_t src_node, bool skip_val)
1329-
{
1330-
// guard against different types
1331-
if(!_is_subset_type_equal(dst, dst_node, src_node))
1332-
return false;
1333-
1334-
// docval | val
1335-
if (is_val(src_node))
1305+
else if (is_keyval(subject_node))
13361306
{
1337-
if (is_val_anchor(src_node))
1338-
{
1339-
if (val_anchor(src_node) != dst->val_anchor(dst_node))
1340-
return false;
1341-
}
1342-
1343-
if(skip_val)
1344-
return true;
1345-
1346-
if (val(src_node) == dst->val(dst_node))
1307+
if( ! reftree->is_keyval(refnode))
1308+
return false;
1309+
if (key(subject_node) == reftree->key(refnode))
13471310
return true;
13481311
return false;
13491312
}
1350-
// keyval
1351-
else if (is_keyval(src_node))
1313+
else if (is_map(subject_node))
13521314
{
1353-
if (is_key_anchor(src_node))
1354-
{
1355-
if (key_anchor(src_node) != dst->key_anchor(dst_node))
1356-
return false;
1357-
}
1315+
if( ! reftree->is_map(refnode))
1316+
return false;
13581317

1359-
if (is_val_anchor(src_node))
1318+
if (num_children(subject_node) > reftree->num_children(refnode))
1319+
return false;
1320+
1321+
for (size_t sch = first_child(subject_node); sch != NONE; sch = next_sibling(sch))
13601322
{
1361-
if (val_anchor(src_node) != dst->val_anchor(dst_node))
1323+
size_t rch = reftree->find_child(refnode, key(sch));
1324+
if (rch == NONE)
1325+
return false;
1326+
if ( ! _has_all_recursive(reftree, rch, sch))
13621327
return false;
13631328
}
1364-
1365-
if (key(src_node) == dst->key(dst_node) && (skip_val || val(src_node) == dst->val(dst_node)))
1366-
return true;
1367-
return false;
1329+
return true;
13681330
}
1369-
// docseq | keyseq | seq
1370-
else if (is_seq(src_node))
1331+
else if (is_seq(subject_node))
13711332
{
1372-
if (num_children(src_node) > dst->num_children(dst_node))
1333+
if( ! reftree->is_seq(refnode))
1334+
return false;
1335+
1336+
if (num_children(subject_node) > reftree->num_children(refnode))
13731337
return false;
13741338

1375-
size_t dch = dst->first_child(dst_node);
1376-
for (size_t sch = first_child(src_node); sch != NONE; sch = next_sibling(sch))
1339+
size_t rch = reftree->first_child(refnode);
1340+
for (size_t sch = first_child(subject_node); sch != NONE; sch = next_sibling(sch))
13771341
{
1378-
if (!_is_subset_strview_recursive(dst, dch, sch, skip_val))
1342+
if ( ! _has_all_recursive(reftree, rch, sch))
13791343
return false;
1380-
dch = dst->next_sibling(dch);
1344+
rch = reftree->next_sibling(rch);
13811345
}
13821346
return true;
13831347
}
1384-
// docmap | keymap | map
1385-
else if (is_map(src_node))
1348+
else if (is_stream(subject_node))
13861349
{
1387-
if (num_children(src_node) > dst->num_children(dst_node))
1350+
if( ! reftree->is_stream(refnode))
1351+
return false;
1352+
1353+
if (num_children(subject_node) > reftree->num_children(refnode))
13881354
return false;
13891355

1390-
for (size_t sch = first_child(src_node); sch != NONE; sch = next_sibling(sch))
1356+
size_t rch = reftree->first_child(refnode);
1357+
for (size_t sch = first_child(subject_node); sch != NONE;sch = next_sibling(sch))
13911358
{
1392-
size_t dch = dst->find_child(dst_node, key(sch));
1393-
if (dch == NONE)
1394-
return false;
1395-
if (!_is_subset_strview_recursive(dst, dch, sch, skip_val))
1359+
if ( ! _has_all_recursive(reftree, rch, sch))
13961360
return false;
1361+
rch = reftree->next_sibling(rch);
13971362
}
13981363
return true;
13991364
}
1400-
// notype
1401-
else if(type(src_node) == NOTYPE)
1365+
else if(type(subject_node) == NOTYPE)
14021366
{
1367+
if(reftree->type(refnode) != NOTYPE)
1368+
return false;
14031369
return true;
14041370
}
14051371
else
@@ -1408,32 +1374,6 @@ bool Tree::_is_subset_strview_recursive(Tree const *dst, size_t dst_node, size_t
14081374
}
14091375
}
14101376

1411-
bool Tree::_is_subset_type_equal(Tree const *dst, size_t dst_node, size_t src_node)
1412-
{
1413-
/* compare different node types for equality. A MAP/SEQ which only
1414-
* differs from one of these types (see below) is accepted because a subset
1415-
* comparator does not care if the MAP/SEQ was from a doc or a key.
1416-
*
1417-
* interchangeable valid types: DOC[MAP/SEQ], KEY[MAP/SEQ] and MAP/SEQ */
1418-
if (type(src_node) != dst->type(dst_node))
1419-
{
1420-
if(is_map(src_node))
1421-
{
1422-
// recheck if the type matches when removing interchangeable types
1423-
if((type(src_node) & ~(DOCMAP | KEYMAP | MAP)) != (dst->type(dst_node) & ~(DOCMAP | KEYMAP | MAP)))
1424-
return false;
1425-
}
1426-
else if(is_seq(src_node))
1427-
{
1428-
if((type(src_node) & ~(DOCSEQ | KEYSEQ | SEQ)) != (dst->type(dst_node) & ~(DOCSEQ | KEYSEQ | SEQ)))
1429-
return false;
1430-
}
1431-
else
1432-
return false;
1433-
}
1434-
return true;
1435-
}
1436-
14371377

14381378
//-----------------------------------------------------------------------------
14391379

src/c4/yml/tree.hpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -929,16 +929,17 @@ class RYML_EXPORT Tree
929929

930930
public:
931931

932-
/** compare string views to see if src node is a subset of dst node */
933-
bool is_subset_strview(Tree const *dst, size_t dst_node = NONE, size_t src_node = NONE);
934-
bool is_subset_strview_skipval(Tree const *dst, size_t dst_node = NONE, size_t src_node = NONE);
932+
/** non-recursive predicates: */
933+
934+
/** reyurn true if subject_node has all the keys or indices in refnode from a reftree
935+
* @note does not check values, only keys (for maps) or indices (for seqs) */
936+
bool has_all(Tree const* reftree, size_t refnode = NONE, size_t subject_node = NONE ) const;
935937

936938
private:
937-
/** compare subset node types */
938-
bool _is_subset_type_equal(Tree const *dst, size_t dst_node, size_t src_node);
939939

940-
bool _is_subset_strview_init(Tree const *dst, size_t dst_node, size_t src_node, bool skip_val);
941-
bool _is_subset_strview_recursive(Tree const *dst, size_t dst_node, size_t src_node, bool skip_val);
940+
/** and helper functions to drive the recursive descent: */
941+
942+
bool _has_all_recursive(Tree const* reftree, size_t refnode, size_t subject_node) const;
942943

943944
/** @} */
944945

0 commit comments

Comments
 (0)