mirror of https://github.com/KLayout/klayout.git
WIP: don't keep a reference to DeepLayer inside DeepShapeStore - that's against the design.
This commit is contained in:
parent
4035c804b7
commit
f83278207c
|
|
@ -240,11 +240,14 @@ struct DeepShapeStore::LayoutHolder
|
||||||
layer_refs [layer] += 1;
|
layer_refs [layer] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_layer_ref (unsigned int layer)
|
bool remove_layer_ref (unsigned int layer)
|
||||||
{
|
{
|
||||||
if ((layer_refs[layer] -= 1) <= 0) {
|
if ((layer_refs[layer] -= 1) <= 0) {
|
||||||
layout.delete_layer (layer);
|
layout.delete_layer (layer);
|
||||||
layer_refs.erase (layer);
|
layer_refs.erase (layer);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -287,9 +290,6 @@ DeepShapeStore::~DeepShapeStore ()
|
||||||
{
|
{
|
||||||
--s_instance_count;
|
--s_instance_count;
|
||||||
|
|
||||||
// because of unregistration we must not do this in the destructor:
|
|
||||||
m_layers_for_flat.clear ();
|
|
||||||
|
|
||||||
for (std::vector<LayoutHolder *>::iterator h = m_layouts.begin (); h != m_layouts.end (); ++h) {
|
for (std::vector<LayoutHolder *>::iterator h = m_layouts.begin (); h != m_layouts.end (); ++h) {
|
||||||
delete *h;
|
delete *h;
|
||||||
}
|
}
|
||||||
|
|
@ -331,7 +331,8 @@ DeepLayer DeepShapeStore::create_from_flat (const db::Region ®ion, double max
|
||||||
}
|
}
|
||||||
|
|
||||||
DeepLayer dl (this, 0 /*singular layout index*/, layer);
|
DeepLayer dl (this, 0 /*singular layout index*/, layer);
|
||||||
m_layers_for_flat [tl::id_of (region.delegate ())] = dl;
|
m_layers_for_flat [tl::id_of (region.delegate ())] = std::make_pair (dl.layout_index (), dl.layer ());
|
||||||
|
m_flat_region_id [std::make_pair (dl.layout_index (), dl.layer ())] = tl::id_of (region.delegate ());
|
||||||
return dl;
|
return dl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -342,11 +343,11 @@ std::pair<bool, DeepLayer> DeepShapeStore::layer_for_flat (const db::Region ®
|
||||||
|
|
||||||
std::pair<bool, DeepLayer> DeepShapeStore::layer_for_flat (size_t region_id) const
|
std::pair<bool, DeepLayer> DeepShapeStore::layer_for_flat (size_t region_id) const
|
||||||
{
|
{
|
||||||
std::map<size_t, DeepLayer>::const_iterator lff = m_layers_for_flat.find (region_id);
|
std::map<size_t, std::pair<unsigned int, unsigned int> >::const_iterator lff = m_layers_for_flat.find (region_id);
|
||||||
if (lff == m_layers_for_flat.end ()) {
|
if (lff == m_layers_for_flat.end ()) {
|
||||||
return std::make_pair (false, DeepLayer ());
|
return std::make_pair (false, DeepLayer ());
|
||||||
} else {
|
} else {
|
||||||
return std::make_pair (true, lff->second);
|
return std::make_pair (true, DeepLayer (const_cast<DeepShapeStore *> (this), lff->second.first, lff->second.second));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -439,7 +440,16 @@ void DeepShapeStore::remove_ref (unsigned int layout, unsigned int layer)
|
||||||
|
|
||||||
tl_assert (layout < (unsigned int) m_layouts.size () && m_layouts[layout] != 0);
|
tl_assert (layout < (unsigned int) m_layouts.size () && m_layouts[layout] != 0);
|
||||||
|
|
||||||
m_layouts[layout]->remove_layer_ref (layer);
|
if (m_layouts[layout]->remove_layer_ref (layer)) {
|
||||||
|
|
||||||
|
// remove from flat region cross ref if required
|
||||||
|
std::map<std::pair<unsigned int, unsigned int>, size_t>::iterator fri = m_flat_region_id.find (std::make_pair (layout, layer));
|
||||||
|
if (fri != m_flat_region_id.end ()) {
|
||||||
|
m_layers_for_flat.erase (fri->second);
|
||||||
|
m_flat_region_id.erase (fri);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if ((m_layouts[layout]->refs -= 1) <= 0) {
|
if ((m_layouts[layout]->refs -= 1) <= 0) {
|
||||||
delete m_layouts[layout];
|
delete m_layouts[layout];
|
||||||
|
|
|
||||||
|
|
@ -593,7 +593,8 @@ private:
|
||||||
DeepShapeStore &operator= (const DeepShapeStore &);
|
DeepShapeStore &operator= (const DeepShapeStore &);
|
||||||
|
|
||||||
std::vector<LayoutHolder *> m_layouts;
|
std::vector<LayoutHolder *> m_layouts;
|
||||||
std::map<size_t, DeepLayer> m_layers_for_flat;
|
std::map<size_t, std::pair<unsigned int, unsigned int> > m_layers_for_flat;
|
||||||
|
std::map<std::pair<unsigned int, unsigned int>, size_t> m_flat_region_id;
|
||||||
layout_map_type m_layout_map;
|
layout_map_type m_layout_map;
|
||||||
int m_threads;
|
int m_threads;
|
||||||
double m_max_area_ratio;
|
double m_max_area_ratio;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue