@@ -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
0 commit comments