From b9b00a08b541e186cbc0d96bdfb698e5db900f85 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 9 Nov 2018 01:14:22 +0100 Subject: [PATCH] Many bug fixes after refactoring. --- src/db/db/dbAsIfFlatEdges.cc | 35 ++++++++++++++++++++---------- src/db/db/dbEdges.h | 4 ++-- src/db/db/dbFlatEdges.cc | 2 +- src/db/db/dbOriginalLayerEdges.cc | 15 ++++++++++--- src/db/db/dbOriginalLayerEdges.h | 3 +++ src/db/db/dbOriginalLayerRegion.cc | 7 ++++++ src/db/db/dbOriginalLayerRegion.h | 3 +++ src/db/unit_tests/dbEdges.cc | 6 ++--- 8 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/db/db/dbAsIfFlatEdges.cc b/src/db/db/dbAsIfFlatEdges.cc index 83ea1d8fb..a97bb9fa9 100644 --- a/src/db/db/dbAsIfFlatEdges.cc +++ b/src/db/db/dbAsIfFlatEdges.cc @@ -386,9 +386,11 @@ AsIfFlatEdges::extended (coord_type ext_b, coord_type ext_e, coord_type ext_o, c db::box_scanner scanner (report_progress (), progress_desc ()); scanner.reserve (size ()); + AddressableEdgeDelivery e (begin (), has_valid_edges ()); + size_t n = 0; - for (EdgesIterator e (begin ()); ! e.at_end (); ++e) { - scanner.insert (&*e, n); + for ( ; ! e.at_end (); ++e) { + scanner.insert (e.operator-> (), n); ++n; } @@ -743,16 +745,21 @@ AsIfFlatEdges::run_check (db::edge_relation_type rel, const Edges *other, db::Co db::box_scanner scanner (report_progress (), progress_desc ()); scanner.reserve (size () + (other ? other->size () : 0)); + AddressableEdgeDelivery e (begin_merged (), has_valid_edges ()); + size_t n = 0; - for (EdgesIterator e (begin_merged ()); ! e.at_end (); ++e) { - scanner.insert (&*e, n); + for ( ; ! e.at_end (); ++e) { + scanner.insert (e.operator-> (), n); n += 2; } + AddressableEdgeDelivery ee; + if (other) { + ee = other->addressable_merged_edges (); n = 1; - for (EdgesIterator e (other->begin_merged ()); ! e.at_end (); ++e) { - scanner.insert (&*e, n); + for ( ; ! ee.at_end (); ++ee) { + scanner.insert (ee.operator-> (), n); n += 2; } } @@ -779,15 +786,21 @@ AsIfFlatEdges::boolean (const Edges *other, EdgeBoolOp op) const db::box_scanner scanner (report_progress (), progress_desc ()); scanner.reserve (size () + (other ? other->size () : 0)); - for (EdgesIterator e (begin ()); ! e.at_end (); ++e) { + AddressableEdgeDelivery e (begin (), has_valid_edges ()); + + for ( ; ! e.at_end (); ++e) { if (! e->is_degenerate ()) { - scanner.insert (&*e, 0); + scanner.insert (e.operator-> (), 0); } } + + AddressableEdgeDelivery ee; + if (other) { - for (EdgesIterator e (other->begin ()); ! e.at_end (); ++e) { - if (! e->is_degenerate ()) { - scanner.insert (&*e, 1); + ee = other->addressable_edges (); + for ( ; ! ee.at_end (); ++ee) { + if (! ee->is_degenerate ()) { + scanner.insert (ee.operator-> (), 1); } } } diff --git a/src/db/db/dbEdges.h b/src/db/db/dbEdges.h index e942a4515..e264b732a 100644 --- a/src/db/db/dbEdges.h +++ b/src/db/db/dbEdges.h @@ -873,7 +873,7 @@ public: */ Edges operator- (const Region &other) const { - return Edges (mp_delegate->and_with (other)); + return Edges (mp_delegate->not_with (other)); } /** @@ -883,7 +883,7 @@ public: */ Edges &operator-= (const Region &other) { - set_delegate (mp_delegate->and_with (other)); + set_delegate (mp_delegate->not_with (other)); return *this; } diff --git a/src/db/db/dbFlatEdges.cc b/src/db/db/dbFlatEdges.cc index 087b73368..2807f1b57 100644 --- a/src/db/db/dbFlatEdges.cc +++ b/src/db/db/dbFlatEdges.cc @@ -106,7 +106,7 @@ FlatEdges::ensure_merged_edges_valid () const m_merged_edges.clear (); - db::Shapes tmp; + db::Shapes tmp (false); EdgeBooleanClusterCollector cluster_collector (&tmp, EdgeOr); db::box_scanner scanner (report_progress (), progress_desc ()); diff --git a/src/db/db/dbOriginalLayerEdges.cc b/src/db/db/dbOriginalLayerEdges.cc index 47054ecc5..5b33e4f02 100644 --- a/src/db/db/dbOriginalLayerEdges.cc +++ b/src/db/db/dbOriginalLayerEdges.cc @@ -139,6 +139,13 @@ OriginalLayerEdges::clone () const return new OriginalLayerEdges (*this); } +void +OriginalLayerEdges::merged_semantics_changed () +{ + m_merged_edges.clear (); + m_merged_edges_valid = false; +} + EdgesIteratorDelegate * OriginalLayerEdges::begin () const { @@ -245,15 +252,17 @@ OriginalLayerEdges::ensure_merged_edges_valid () const m_merged_edges.clear (); - db::Shapes tmp; + db::Shapes tmp (false); EdgeBooleanClusterCollector cluster_collector (&tmp, EdgeOr); db::box_scanner scanner (report_progress (), progress_desc ()); scanner.reserve (size ()); - for (EdgesIterator e (begin ()); ! e.at_end (); ++e) { + AddressableEdgeDelivery e (begin (), has_valid_edges ()); + + for ( ; ! e.at_end (); ++e) { if (! e->is_degenerate ()) { - scanner.insert (&*e, 0); + scanner.insert (e.operator-> (), 0); } } diff --git a/src/db/db/dbOriginalLayerEdges.h b/src/db/db/dbOriginalLayerEdges.h index 19f0ab241..13a4d70c5 100644 --- a/src/db/db/dbOriginalLayerEdges.h +++ b/src/db/db/dbOriginalLayerEdges.h @@ -66,6 +66,9 @@ public: virtual bool equals (const Edges &other) const; virtual bool less (const Edges &other) const; +protected: + virtual void merged_semantics_changed (); + private: OriginalLayerEdges &operator= (const OriginalLayerEdges &other); diff --git a/src/db/db/dbOriginalLayerRegion.cc b/src/db/db/dbOriginalLayerRegion.cc index 7fbc11839..a043ab411 100644 --- a/src/db/db/dbOriginalLayerRegion.cc +++ b/src/db/db/dbOriginalLayerRegion.cc @@ -139,6 +139,13 @@ OriginalLayerRegion::clone () const return new OriginalLayerRegion (*this); } +void +OriginalLayerRegion::merged_semantics_changed () +{ + m_merged_polygons.clear (); + m_merged_polygons_valid = false; +} + RegionIteratorDelegate * OriginalLayerRegion::begin () const { diff --git a/src/db/db/dbOriginalLayerRegion.h b/src/db/db/dbOriginalLayerRegion.h index 2584dda7b..b712e2843 100644 --- a/src/db/db/dbOriginalLayerRegion.h +++ b/src/db/db/dbOriginalLayerRegion.h @@ -64,6 +64,9 @@ public: virtual bool equals (const Region &other) const; virtual bool less (const Region &other) const; +protected: + virtual void merged_semantics_changed (); + private: OriginalLayerRegion &operator= (const OriginalLayerRegion &other); diff --git a/src/db/unit_tests/dbEdges.cc b/src/db/unit_tests/dbEdges.cc index 6a5a3c7b1..d37e10a31 100644 --- a/src/db/unit_tests/dbEdges.cc +++ b/src/db/unit_tests/dbEdges.cc @@ -53,7 +53,7 @@ TEST(1) EXPECT_EQ (r.bbox ().to_string (), "(0,0;100,200)"); EXPECT_EQ (r.transformed (db::Trans (db::Vector (1, 2))).bbox ().to_string (), "(1,2;101,202)"); EXPECT_EQ (r.empty (), false); - EXPECT_EQ (r.is_merged (), false); + EXPECT_EQ (r.is_merged (), true); EXPECT_EQ (r.begin ().at_end (), false); db::Edges r1 = r; @@ -638,7 +638,7 @@ TEST(20) EXPECT_EQ (r1.to_string (), "(120,20;120,40);(120,40;140,40);(140,40;140,20);(140,20;120,20);(160,80;160,140);(220,80;160,80)"); EXPECT_EQ (r1.has_valid_edges (), false); EXPECT_EQ (r1.length (), db::Edges::length_type (200)); - EXPECT_EQ (r1.has_valid_edges (), true); // length, since merging, will implicitly convert to valid edges + EXPECT_EQ (r1.has_valid_edges (), false); EXPECT_EQ (r1.bbox ().to_string (), "(120,20;220,140)"); EXPECT_EQ (r1.size (), size_t (6)); EXPECT_EQ (r1.empty (), false); @@ -649,7 +649,7 @@ TEST(20) EXPECT_EQ (rr.to_string (), "(120,20;120,40);(120,40;140,40);(140,40;140,20);(140,20;120,20)"); db::Edges r2 = r1; - EXPECT_EQ (r2.has_valid_edges (), true); + EXPECT_EQ (r2.has_valid_edges (), false); EXPECT_EQ (r2.length (), db::Edges::length_type (200)); EXPECT_EQ (r2.bbox ().to_string (), "(120,20;220,140)"); EXPECT_EQ (r2.size (), size_t (6));