[PORTBACK] fixed an issue with in-place processing of flat regions

This commit is contained in:
Matthias Koefferlein 2020-10-01 23:10:24 +02:00
parent 145c298d58
commit 61f18f7f33
4 changed files with 59 additions and 22 deletions

View File

@ -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
*/

View File

@ -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<db::Polygon, db::unstable_layer_tag> ().begin ();
for (RegionIterator p (begin_merged ()); ! p.at_end (); ++p) {
db::layer<db::Polygon, db::unstable_layer_tag> &poly_layer = m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ();
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<db::Polygon, db::unstable_layer_tag> ().end ()) {
m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().insert (*p);
pw = m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().end ();
if (pw == poly_layer.end ()) {
poly_layer.insert (*p);
poly_layer.end ();
} else {
m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().replace (pw++, *p);
poly_layer.replace (pw++, *p);
}
}
}
m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().erase (pw, m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().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<db::Polygon, db::unstable_layer_tag> &poly_layer = m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ();
db::layer<db::Polygon, db::unstable_layer_tag> out;
std::vector<db::Polygon> poly_res;
polygon_iterator_type pw = m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().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<db::Polygon>::const_iterator pr = poly_res.begin (); pr != poly_res.end (); ++pr) {
if (pw == m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().end ()) {
m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().insert (*pr);
pw = m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().end ();
} else {
m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().replace (pw++, *pr);
}
}
out.insert (poly_res.begin (), poly_res.end ());
}
m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().erase (pw, m_polygons.get_layer<db::Polygon, db::unstable_layer_tag> ().end ());
poly_layer.swap (out);
m_merged_polygons.clear ();
m_is_merged = filter.result_is_merged () && merged_semantics ();

View File

@ -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) {

View File

@ -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;