mirror of https://github.com/KLayout/klayout.git
[PORTBACK] fixed an issue with in-place processing of flat regions
This commit is contained in:
parent
145c298d58
commit
61f18f7f33
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue