Some refactoring

This commit is contained in:
Matthias Koefferlein 2026-07-19 23:36:14 +02:00
parent 604db5a1aa
commit b2b5df3d45
2 changed files with 43 additions and 12 deletions

View File

@ -1242,9 +1242,21 @@ AsIfFlatRegion::run_check (db::edge_relation_type rel, bool different_polygons,
}
bool needs_merged_primary = (! has_other && different_polygons) || options.needs_merged ();
bool primary_is_merged = is_merged ();
db::RegionIterator polygons;
db::RegionIterator polygons (needs_merged_primary ? begin_merged () : begin ());
bool primary_is_merged = ! merged_semantics () || needs_merged_primary || is_merged ();
if (! merged_semantics ()) {
primary_is_merged = true; // means: don't merge again
needs_merged_primary = false;
polygons = begin ();
} else if (! needs_merged_primary) {
// The implementation may run faster if the primary is not merged
primary_is_merged = false;
polygons = begin_unmerged ();
} else {
primary_is_merged = true;
polygons = begin_merged ();
}
EdgeRelationFilter check (rel, d, options);

View File

@ -2376,19 +2376,45 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
bool has_other = other && other != subject_regionptr () && other != foreign_regionptr ();
// delegate to AsIfFlatRegion if the other region is not a deep one
const db::DeepRegion *other_deep = 0;
if (has_other) {
other_deep = dynamic_cast<const db::DeepRegion *> (other->delegate ());
if (! other_deep) {
return db::AsIfFlatRegion::run_check (rel, different_polygons, other, d, options);
}
}
// force different polygons in the different properties case to skip intra-polygon checks
if (! has_other && pc_always_different (options.prop_constraint)) {
// TODO: this forces merged primaries, so maybe that is not a good optimization?
different_polygons = true;
}
const db::DeepRegion *other_deep = 0;
bool other_is_merged = true;
// primary input
bool needs_merged_primary = (! has_other && different_polygons) || options.needs_merged ();
bool primary_is_merged = ! merged_semantics () || needs_merged_primary || is_merged ();
bool primary_is_merged = false;
db::DeepLayer polygons;
if (! merged_semantics ()) {
primary_is_merged = true; // means: don't merge again
polygons = deep_layer ();
} else if (! needs_merged_primary) {
// The implementation may run faster if the primary is not merged
primary_is_merged = false;
ensure_unmerged_polygons_valid ();
polygons = deep_layer ();
} else {
primary_is_merged = true;
polygons = merged_deep_layer ();
}
// other input
std::vector<unsigned int> other_layers;
bool other_is_merged = true;
if (! has_other) {
@ -2397,11 +2423,6 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
} else {
other_deep = dynamic_cast<const db::DeepRegion *> (other->delegate ());
if (! other_deep) {
return db::AsIfFlatRegion::run_check (rel, different_polygons, other, d, options);
}
if (! other->merged_semantics ()) {
other_layers.push_back (other_deep->deep_layer ().layer ());
other_is_merged = true;
@ -2421,8 +2442,6 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
}
const db::DeepLayer &polygons = needs_merged_primary ? merged_deep_layer () : deep_layer ();
EdgeRelationFilter check (rel, d, options);
std::unique_ptr<db::DeepEdgePairs> res (new db::DeepEdgePairs (polygons.derived ()));