From 61f18f7f3312abfe14eb246f8c9f565cb8acf83b Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 1 Oct 2020 23:10:24 +0200 Subject: [PATCH] [PORTBACK] fixed an issue with in-place processing of flat regions --- src/db/db/dbBoxTree.h | 19 +++++++++++++++++++ src/db/db/dbFlatRegion.cc | 39 +++++++++++++++++---------------------- src/db/db/dbLayer.h | 12 ++++++++++++ src/tl/tl/tlReuseVector.h | 11 +++++++++++ 4 files changed, 59 insertions(+), 22 deletions(-) diff --git a/src/db/db/dbBoxTree.h b/src/db/db/dbBoxTree.h index 982993496..fb31510cf 100644 --- a/src/db/db/dbBoxTree.h +++ b/src/db/db/dbBoxTree.h @@ -1138,6 +1138,16 @@ public: return mp_root; } + /** + * @brief Swaps the box tree with another one + */ + void swap (box_tree &other) + { + m_objects.swap (other.m_objects); + m_elements.swap (other.m_elements); + std::swap (mp_root, other.mp_root); + } + /** * @brief Collect memory statistics */ @@ -2076,6 +2086,15 @@ public: return mp_root; } + /** + * @brief Swaps the box tree with another one + */ + void swap (unstable_box_tree &other) + { + m_objects.swap (other.m_objects); + std::swap (mp_root, other.mp_root); + } + /** * @brief Collect memory statistics */ diff --git a/src/db/db/dbFlatRegion.cc b/src/db/db/dbFlatRegion.cc index 9c0249a72..1a634132d 100644 --- a/src/db/db/dbFlatRegion.cc +++ b/src/db/db/dbFlatRegion.cc @@ -193,47 +193,42 @@ Box FlatRegion::compute_bbox () const RegionDelegate *FlatRegion::filter_in_place (const PolygonFilterBase &filter) { - polygon_iterator_type pw = m_polygons.get_layer ().begin (); - for (RegionIterator p (begin_merged ()); ! p.at_end (); ++p) { + db::layer &poly_layer = m_polygons.get_layer (); + + polygon_iterator_type pw = poly_layer.begin (); + for (RegionIterator p (filter.requires_raw_input () ? begin () : begin_merged ()); ! p.at_end (); ++p) { if (filter.selected (*p)) { - if (pw == m_polygons.get_layer ().end ()) { - m_polygons.get_layer ().insert (*p); - pw = m_polygons.get_layer ().end (); + if (pw == poly_layer.end ()) { + poly_layer.insert (*p); + poly_layer.end (); } else { - m_polygons.get_layer ().replace (pw++, *p); + poly_layer.replace (pw++, *p); } } } - m_polygons.get_layer ().erase (pw, m_polygons.get_layer ().end ()); + poly_layer.erase (pw, poly_layer.end ()); + m_merged_polygons.clear (); - m_is_merged = merged_semantics (); + m_is_merged = filter.requires_raw_input () ? false : merged_semantics (); return this; } RegionDelegate *FlatRegion::process_in_place (const PolygonProcessorBase &filter) { + db::layer &poly_layer = m_polygons.get_layer (); + db::layer out; + std::vector poly_res; - - polygon_iterator_type pw = m_polygons.get_layer ().begin (); for (RegionIterator p (filter.requires_raw_input () ? begin () : begin_merged ()); ! p.at_end (); ++p) { - poly_res.clear (); filter.process (*p, poly_res); - - for (std::vector::const_iterator pr = poly_res.begin (); pr != poly_res.end (); ++pr) { - if (pw == m_polygons.get_layer ().end ()) { - m_polygons.get_layer ().insert (*pr); - pw = m_polygons.get_layer ().end (); - } else { - m_polygons.get_layer ().replace (pw++, *pr); - } - } - + out.insert (poly_res.begin (), poly_res.end ()); } - m_polygons.get_layer ().erase (pw, m_polygons.get_layer ().end ()); + poly_layer.swap (out); + m_merged_polygons.clear (); m_is_merged = filter.result_is_merged () && merged_semantics (); diff --git a/src/db/db/dbLayer.h b/src/db/db/dbLayer.h index f574775d7..affedac55 100644 --- a/src/db/db/dbLayer.h +++ b/src/db/db/dbLayer.h @@ -443,6 +443,18 @@ struct layer return m_box_tree.empty (); } + /** + * @brief Swaps the layer with another one + */ + void swap (layer &other) + { + m_box_tree.swap (other.m_box_tree); + std::swap (m_bbox, other.m_bbox); + bool x; + x = other.m_bbox_dirty; other.m_bbox_dirty = m_bbox_dirty; m_bbox_dirty = x; + x = other.m_tree_dirty; other.m_tree_dirty = m_tree_dirty; m_tree_dirty = x; + } + void mem_stat (MemStatistics *stat, MemStatistics::purpose_t purpose, int cat, bool no_self, void *parent) const { if (! no_self) { diff --git a/src/tl/tl/tlReuseVector.h b/src/tl/tl/tlReuseVector.h index fba063d54..51db9d6a2 100644 --- a/src/tl/tl/tlReuseVector.h +++ b/src/tl/tl/tlReuseVector.h @@ -910,6 +910,17 @@ public: return mp_rdata; } + /** + * @brief Swaps the vector with another one + */ + void swap (reuse_vector &other) + { + std::swap (mp_start, other.mp_start); + std::swap (mp_finish, other.mp_finish); + std::swap (mp_capacity, other.mp_capacity); + std::swap (mp_rdata, other.mp_rdata); + } + private: value_type *mp_start, *mp_finish, *mp_capacity; ReuseData *mp_rdata;