From b2b5df3d4553633bd316a16aef8d99f5ad305ad7 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 19 Jul 2026 23:36:14 +0200 Subject: [PATCH] Some refactoring --- src/db/db/dbAsIfFlatRegion.cc | 16 ++++++++++++-- src/db/db/dbDeepRegion.cc | 39 ++++++++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/db/db/dbAsIfFlatRegion.cc b/src/db/db/dbAsIfFlatRegion.cc index 85111a923..1821899d3 100644 --- a/src/db/db/dbAsIfFlatRegion.cc +++ b/src/db/db/dbAsIfFlatRegion.cc @@ -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); diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc index 235579f22..952607903 100644 --- a/src/db/db/dbDeepRegion.cc +++ b/src/db/db/dbDeepRegion.cc @@ -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 (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 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 (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 res (new db::DeepEdgePairs (polygons.derived ()));