@@ -1282,124 +1282,90 @@ void Tree::merge_with(Tree const *src, size_t src_node, size_t dst_node)
1282
1282
1283
1283
// -----------------------------------------------------------------------------
1284
1284
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
1286
1286
{
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 ();
1289
1292
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);
1293
1294
}
1294
1295
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
1296
1297
{
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))
1309
1299
{
1310
- if ( num_children (src_node) > dst-> num_children (dst_node ))
1300
+ if ( ! reftree-> is_val (refnode ))
1311
1301
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
1320
1303
return true ;
1321
1304
}
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))
1336
1306
{
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))
1347
1310
return true ;
1348
1311
return false ;
1349
1312
}
1350
- // keyval
1351
- else if (is_keyval (src_node))
1313
+ else if (is_map (subject_node))
1352
1314
{
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 ;
1358
1317
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))
1360
1322
{
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))
1362
1327
return false ;
1363
1328
}
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 ;
1368
1330
}
1369
- // docseq | keyseq | seq
1370
- else if (is_seq (src_node))
1331
+ else if (is_seq (subject_node))
1371
1332
{
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))
1373
1337
return false ;
1374
1338
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))
1377
1341
{
1378
- if (! _is_subset_strview_recursive (dst, dch , sch, skip_val ))
1342
+ if ( ! _has_all_recursive (reftree, rch , sch))
1379
1343
return false ;
1380
- dch = dst ->next_sibling (dch );
1344
+ rch = reftree ->next_sibling (rch );
1381
1345
}
1382
1346
return true ;
1383
1347
}
1384
- // docmap | keymap | map
1385
- else if (is_map (src_node))
1348
+ else if (is_stream (subject_node))
1386
1349
{
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))
1388
1354
return false ;
1389
1355
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))
1391
1358
{
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))
1396
1360
return false ;
1361
+ rch = reftree->next_sibling (rch);
1397
1362
}
1398
1363
return true ;
1399
1364
}
1400
- // notype
1401
- else if (type (src_node) == NOTYPE)
1365
+ else if (type (subject_node) == NOTYPE)
1402
1366
{
1367
+ if (reftree->type (refnode) != NOTYPE)
1368
+ return false ;
1403
1369
return true ;
1404
1370
}
1405
1371
else
@@ -1408,32 +1374,6 @@ bool Tree::_is_subset_strview_recursive(Tree const *dst, size_t dst_node, size_t
1408
1374
}
1409
1375
}
1410
1376
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
-
1437
1377
1438
1378
// -----------------------------------------------------------------------------
1439
1379
0 commit comments