Mitigating the effect of a locked layout: plain iteration of instances now is possible also with a locked layout. Before, the instances were correctly iterated only if the layout could be sorted.

This commit is contained in:
Matthias Koefferlein
2024-10-27 23:42:16 +01:00
parent 946729f14d
commit cdd7058866
3 changed files with 207 additions and 23 deletions
+85 -12
View File
@@ -280,12 +280,18 @@ void
instance_iterator<Traits>::release_iter () instance_iterator<Traits>::release_iter ()
{ {
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()).~stable_iter_wp_type (); basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()).~stable_iter_wp_type ();
} else { } else {
basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()).~stable_iter_type (); basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()).~stable_iter_type ();
} }
} else if (m_stable) {
if (m_with_props) {
basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()).~stable_unsorted_iter_wp_type ();
} else {
basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()).~stable_unsorted_iter_type ();
}
} else { } else {
if (m_with_props) { if (m_with_props) {
basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()).~iter_wp_type (); basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()).~iter_wp_type ();
@@ -301,12 +307,18 @@ void
instance_iterator<Traits>::make_iter () instance_iterator<Traits>::make_iter ()
{ {
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())) stable_iter_wp_type (); new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())) stable_iter_wp_type ();
} else { } else {
new (&basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())) stable_iter_type (); new (&basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())) stable_iter_type ();
} }
} else if (m_stable) {
if (m_with_props) {
new (&basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())) stable_unsorted_iter_wp_type ();
} else {
new (&basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ())) stable_unsorted_iter_type ();
}
} else { } else {
if (m_with_props) { if (m_with_props) {
new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())) iter_wp_type (); new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())) iter_wp_type ();
@@ -322,18 +334,24 @@ template <class Traits>
bool bool
instance_iterator<Traits>::operator== (const instance_iterator<Traits> &d) const instance_iterator<Traits>::operator== (const instance_iterator<Traits> &d) const
{ {
if (! (m_type == d.m_type && m_stable == d.m_stable && m_with_props == d.m_with_props)) { if (! (m_type == d.m_type && m_stable == d.m_stable && m_with_props == d.m_with_props && m_unsorted == d.m_unsorted)) {
return false; return false;
} }
if (m_type == TNull) { if (m_type == TNull) {
return true; return true;
} else { } else {
if (m_stable) { if (m_stable) {
if (m_with_props) { if (m_with_props && ! m_unsorted) {
return (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()) == d.basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())); return (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()) == d.basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else { } else {
return (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()) == d.basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())); return (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()) == d.basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
} }
} else if (m_stable) {
if (m_with_props) {
return (basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()) == d.basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else {
return (basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()) == d.basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
}
} else { } else {
if (m_with_props) { if (m_with_props) {
return (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()) == d.basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())); return (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()) == d.basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()));
@@ -355,16 +373,23 @@ instance_iterator<Traits>::operator= (const instance_iterator<Traits> &iter)
m_type = iter.m_type; m_type = iter.m_type;
m_stable = iter.m_stable; m_stable = iter.m_stable;
m_with_props = iter.m_with_props; m_with_props = iter.m_with_props;
m_unsorted = iter.m_unsorted;
m_traits = iter.m_traits; m_traits = iter.m_traits;
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())) stable_iter_wp_type (iter.basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())); new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())) stable_iter_wp_type (iter.basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else { } else {
new (&basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())) stable_iter_type (iter.basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())); new (&basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())) stable_iter_type (iter.basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
} }
} else if (m_stable) {
if (m_with_props) {
new (&basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())) stable_unsorted_iter_wp_type (iter.basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else {
new (&basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ())) stable_unsorted_iter_type (iter.basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
}
} else { } else {
if (m_with_props) { if (m_with_props) {
new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())) iter_wp_type (iter.basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())); new (&basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())) iter_wp_type (iter.basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()));
@@ -387,12 +412,18 @@ db::Box
instance_iterator<Traits>::quad_box () const instance_iterator<Traits>::quad_box () const
{ {
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
return m_traits.quad_box (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())); return m_traits.quad_box (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else { } else {
return m_traits.quad_box (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())); return m_traits.quad_box (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
} }
} else if (m_stable) {
if (m_with_props) {
return m_traits.quad_box (basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else {
return m_traits.quad_box (basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
}
} else { } else {
if (m_with_props) { if (m_with_props) {
return m_traits.quad_box (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())); return m_traits.quad_box (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()));
@@ -409,12 +440,18 @@ size_t
instance_iterator<Traits>::quad_id () const instance_iterator<Traits>::quad_id () const
{ {
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
return m_traits.quad_id (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())); return m_traits.quad_id (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else { } else {
return m_traits.quad_id (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())); return m_traits.quad_id (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
} }
} else if (m_stable) {
if (m_with_props) {
return m_traits.quad_id (basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else {
return m_traits.quad_id (basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
}
} else { } else {
if (m_with_props) { if (m_with_props) {
return m_traits.quad_id (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())); return m_traits.quad_id (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()));
@@ -431,12 +468,18 @@ void
instance_iterator<Traits>::skip_quad () instance_iterator<Traits>::skip_quad ()
{ {
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
m_traits.skip_quad (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())); m_traits.skip_quad (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else { } else {
m_traits.skip_quad (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())); m_traits.skip_quad (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
} }
} else if (m_stable) {
if (m_with_props) {
m_traits.skip_quad (basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else {
m_traits.skip_quad (basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
}
} else { } else {
if (m_with_props) { if (m_with_props) {
m_traits.skip_quad (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())); m_traits.skip_quad (basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()));
@@ -454,12 +497,18 @@ instance_iterator<Traits> &
instance_iterator<Traits>::operator++() instance_iterator<Traits>::operator++()
{ {
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
++basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()); ++basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ());
} else { } else {
++basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()); ++basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ());
} }
} else if (m_stable) {
if (m_with_props) {
++basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ());
} else {
++basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ());
}
} else { } else {
if (m_with_props) { if (m_with_props) {
++basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()); ++basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ());
@@ -478,7 +527,7 @@ void
instance_iterator<Traits>::make_next () instance_iterator<Traits>::make_next ()
{ {
while (true) { while (true) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
if (! basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()).at_end ()) { if (! basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()).at_end ()) {
return; return;
@@ -488,6 +537,16 @@ instance_iterator<Traits>::make_next ()
return; return;
} }
} }
} else if (m_stable) {
if (m_with_props) {
if (! basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()).at_end ()) {
return;
}
} else {
if (! basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()).at_end ()) {
return;
}
}
} else { } else {
if (m_with_props) { if (m_with_props) {
if (! basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()).at_end ()) { if (! basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()).at_end ()) {
@@ -514,12 +573,18 @@ void
instance_iterator<Traits>::update_ref () instance_iterator<Traits>::update_ref ()
{ {
if (m_type == TInstance) { if (m_type == TInstance) {
if (m_stable) { if (m_stable && ! m_unsorted) {
if (m_with_props) { if (m_with_props) {
m_ref = m_traits.instance_from_stable_iter (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ())); m_ref = m_traits.instance_from_stable_iter (basic_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else { } else {
m_ref = m_traits.instance_from_stable_iter (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ())); m_ref = m_traits.instance_from_stable_iter (basic_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
} }
} else if (m_stable) {
if (m_with_props) {
m_ref = m_traits.instance_from_stable_iter (basic_unsorted_iter (cell_inst_wp_array_type::tag (), InstancesEditableTag ()));
} else {
m_ref = m_traits.instance_from_stable_iter (basic_unsorted_iter (cell_inst_array_type::tag (), InstancesEditableTag ()));
}
} else { } else {
if (m_with_props) { if (m_with_props) {
m_ref = value_type (m_traits.instances (), *basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ())); m_ref = value_type (m_traits.instances (), *basic_iter (cell_inst_wp_array_type::tag (), InstancesNonEditableTag ()));
@@ -551,7 +616,7 @@ void
NormalInstanceIteratorTraits::init (instance_iterator<NormalInstanceIteratorTraits> *iter) const NormalInstanceIteratorTraits::init (instance_iterator<NormalInstanceIteratorTraits> *iter) const
{ {
tl_assert (mp_insts != 0); tl_assert (mp_insts != 0);
if (iter->m_stable) { if (iter->m_stable && ! iter->m_unsorted) {
if (iter->m_with_props) { if (iter->m_with_props) {
cell_inst_wp_array_type::tag tag = cell_inst_wp_array_type::tag (); cell_inst_wp_array_type::tag tag = cell_inst_wp_array_type::tag ();
iter->basic_iter (tag, InstancesEditableTag ()) = mp_insts->inst_tree (tag, InstancesEditableTag ()).begin_flat (); iter->basic_iter (tag, InstancesEditableTag ()) = mp_insts->inst_tree (tag, InstancesEditableTag ()).begin_flat ();
@@ -559,6 +624,14 @@ NormalInstanceIteratorTraits::init (instance_iterator<NormalInstanceIteratorTrai
cell_inst_array_type::tag tag = cell_inst_array_type::tag (); cell_inst_array_type::tag tag = cell_inst_array_type::tag ();
iter->basic_iter (tag, InstancesEditableTag ()) = mp_insts->inst_tree (tag, InstancesEditableTag ()).begin_flat (); iter->basic_iter (tag, InstancesEditableTag ()) = mp_insts->inst_tree (tag, InstancesEditableTag ()).begin_flat ();
} }
} else if (iter->m_stable) {
if (iter->m_with_props) {
cell_inst_wp_array_type::tag tag = cell_inst_wp_array_type::tag ();
iter->basic_unsorted_iter (tag, InstancesEditableTag ()) = stable_unsorted_iter_wp_type (mp_insts->inst_tree (tag, InstancesEditableTag ()).begin (), mp_insts->inst_tree (tag, InstancesEditableTag ()).end ());
} else {
cell_inst_array_type::tag tag = cell_inst_array_type::tag ();
iter->basic_unsorted_iter (tag, InstancesEditableTag ()) = stable_unsorted_iter_type (mp_insts->inst_tree (tag, InstancesEditableTag ()).begin (), mp_insts->inst_tree (tag, InstancesEditableTag ()).end ());
}
} else { } else {
if (iter->m_with_props) { if (iter->m_with_props) {
cell_inst_wp_array_type::tag tag = cell_inst_wp_array_type::tag (); cell_inst_wp_array_type::tag tag = cell_inst_wp_array_type::tag ();
+59 -11
View File
@@ -527,7 +527,9 @@ public:
typedef typename IterTraits::iter_wp_type iter_wp_type; typedef typename IterTraits::iter_wp_type iter_wp_type;
typedef typename IterTraits::stable_iter_type stable_iter_type; typedef typename IterTraits::stable_iter_type stable_iter_type;
typedef typename IterTraits::stable_iter_wp_type stable_iter_wp_type; typedef typename IterTraits::stable_iter_wp_type stable_iter_wp_type;
typedef const value_type *pointer; typedef typename IterTraits::stable_unsorted_iter_type stable_unsorted_iter_type;
typedef typename IterTraits::stable_unsorted_iter_wp_type stable_unsorted_iter_wp_type;
typedef const value_type *pointer;
typedef value_type reference; // operator* returns a value typedef value_type reference; // operator* returns a value
typedef std::forward_iterator_tag iterator_category; typedef std::forward_iterator_tag iterator_category;
typedef void difference_type; typedef void difference_type;
@@ -541,7 +543,7 @@ public:
* @brief Default ctor * @brief Default ctor
*/ */
instance_iterator () instance_iterator ()
: m_with_props (false), m_stable (false), m_type (TNull), m_traits () : m_type (TNull), m_with_props (false), m_stable (false), m_unsorted (false), m_traits ()
{ } { }
/** /**
@@ -556,7 +558,7 @@ public:
* @brief Constructor * @brief Constructor
*/ */
instance_iterator (const IterTraits &traits) instance_iterator (const IterTraits &traits)
: m_with_props (false), m_stable (traits.instances ()->is_editable ()), m_type (TInstance), m_traits (traits) : m_type (TInstance), m_with_props (false), m_stable (traits.instances ()->is_editable ()), m_unsorted (traits.instances ()->instance_tree_needs_sort ()), m_traits (traits)
{ {
make_iter (); make_iter ();
make_next (); make_next ();
@@ -567,7 +569,7 @@ public:
* @brief Copy constructor * @brief Copy constructor
*/ */
instance_iterator (const instance_iterator &iter) instance_iterator (const instance_iterator &iter)
: m_with_props (false), m_stable (false), m_type (TNull), m_traits () : m_type (TNull), m_with_props (false), m_stable (false), m_unsorted (false), m_traits ()
{ {
operator= (iter); operator= (iter);
} }
@@ -661,7 +663,7 @@ public:
*/ */
stable_iter_type &basic_iter (cell_inst_array_type::tag, InstancesEditableTag) stable_iter_type &basic_iter (cell_inst_array_type::tag, InstancesEditableTag)
{ {
tl_assert (m_type == TInstance && m_stable == true && m_with_props == false); tl_assert (m_type == TInstance && m_stable == true && m_with_props == false && m_unsorted == false);
return *((stable_iter_type *) m_generic.stable_iter); return *((stable_iter_type *) m_generic.stable_iter);
} }
@@ -670,10 +672,28 @@ public:
*/ */
const stable_iter_type &basic_iter (cell_inst_array_type::tag, InstancesEditableTag) const const stable_iter_type &basic_iter (cell_inst_array_type::tag, InstancesEditableTag) const
{ {
tl_assert (m_type == TInstance && m_stable == true && m_with_props == false); tl_assert (m_type == TInstance && m_stable == true && m_with_props == false && m_unsorted == false);
return *((stable_iter_type *) m_generic.stable_iter); return *((stable_iter_type *) m_generic.stable_iter);
} }
/**
* @brief Gets the basic iterator in the editable case without properties and in the unsorted case
*/
stable_unsorted_iter_type &basic_unsorted_iter (cell_inst_array_type::tag, InstancesEditableTag)
{
tl_assert (m_type == TInstance && m_stable == true && m_with_props == false && m_unsorted == true);
return *((stable_unsorted_iter_type *) m_generic.stable_unsorted_iter);
}
/**
* @brief Gets the basic iterator in the editable case without properties and in the unsorted case (const version)
*/
const stable_unsorted_iter_type &basic_unsorted_iter (cell_inst_array_type::tag, InstancesEditableTag) const
{
tl_assert (m_type == TInstance && m_stable == true && m_with_props == false && m_unsorted == true);
return *((stable_unsorted_iter_type *) m_generic.stable_unsorted_iter);
}
/** /**
* @brief Gets the basic iterator in the non-editable case with properties * @brief Gets the basic iterator in the non-editable case with properties
*/ */
@@ -697,7 +717,7 @@ public:
*/ */
stable_iter_wp_type &basic_iter (cell_inst_wp_array_type::tag, InstancesEditableTag) stable_iter_wp_type &basic_iter (cell_inst_wp_array_type::tag, InstancesEditableTag)
{ {
tl_assert (m_type == TInstance && m_stable == true && m_with_props == true); tl_assert (m_type == TInstance && m_stable == true && m_with_props == true && m_unsorted == false);
return *((stable_iter_wp_type *) m_generic.pstable_iter); return *((stable_iter_wp_type *) m_generic.pstable_iter);
} }
@@ -706,10 +726,28 @@ public:
*/ */
const stable_iter_wp_type &basic_iter (cell_inst_wp_array_type::tag, InstancesEditableTag) const const stable_iter_wp_type &basic_iter (cell_inst_wp_array_type::tag, InstancesEditableTag) const
{ {
tl_assert (m_type == TInstance && m_stable == true && m_with_props == true); tl_assert (m_type == TInstance && m_stable == true && m_with_props == true && m_unsorted == false);
return *((stable_iter_wp_type *) m_generic.pstable_iter); return *((stable_iter_wp_type *) m_generic.pstable_iter);
} }
/**
* @brief Gets the basic iterator in the editable case with properties and in the unsorted case
*/
stable_unsorted_iter_wp_type &basic_unsorted_iter (cell_inst_wp_array_type::tag, InstancesEditableTag)
{
tl_assert (m_type == TInstance && m_stable == true && m_with_props == true && m_unsorted == true);
return *((stable_unsorted_iter_wp_type *) m_generic.pstable_unsorted_iter);
}
/**
* @brief Gets the basic iterator in the editable case with properties and in the unsorted case (const version)
*/
const stable_unsorted_iter_wp_type &basic_unsorted_iter (cell_inst_wp_array_type::tag, InstancesEditableTag) const
{
tl_assert (m_type == TInstance && m_stable == true && m_with_props == true && m_unsorted == true);
return *((stable_unsorted_iter_wp_type *) m_generic.pstable_unsorted_iter);
}
private: private:
friend struct NormalInstanceIteratorTraits; friend struct NormalInstanceIteratorTraits;
friend struct OverlappingInstanceIteratorTraits; friend struct OverlappingInstanceIteratorTraits;
@@ -720,11 +758,14 @@ private:
char piter[sizeof (iter_wp_type)]; char piter[sizeof (iter_wp_type)];
char stable_iter[sizeof (stable_iter_type)]; char stable_iter[sizeof (stable_iter_type)];
char pstable_iter[sizeof (stable_iter_wp_type)]; char pstable_iter[sizeof (stable_iter_wp_type)];
char stable_unsorted_iter[sizeof (stable_unsorted_iter_type)];
char pstable_unsorted_iter[sizeof (stable_unsorted_iter_wp_type)];
} m_generic; } m_generic;
bool m_with_props : 8;
bool m_stable : 8;
object_type m_type : 16; object_type m_type : 16;
bool m_with_props : 1;
bool m_stable : 1;
bool m_unsorted : 1;
value_type m_ref; value_type m_ref;
IterTraits m_traits; IterTraits m_traits;
@@ -759,6 +800,8 @@ struct DB_PUBLIC NormalInstanceIteratorTraits
typedef tl::iterator_pair<cell_inst_wp_tree_type::const_iterator> iter_wp_type; typedef tl::iterator_pair<cell_inst_wp_tree_type::const_iterator> iter_wp_type;
typedef stable_cell_inst_tree_type::flat_iterator stable_iter_type; typedef stable_cell_inst_tree_type::flat_iterator stable_iter_type;
typedef stable_cell_inst_wp_tree_type::flat_iterator stable_iter_wp_type; typedef stable_cell_inst_wp_tree_type::flat_iterator stable_iter_wp_type;
typedef tl::iterator_pair<stable_cell_inst_tree_type::const_iterator> stable_unsorted_iter_type;
typedef tl::iterator_pair<stable_cell_inst_wp_tree_type::const_iterator> stable_unsorted_iter_wp_type;
NormalInstanceIteratorTraits (); NormalInstanceIteratorTraits ();
NormalInstanceIteratorTraits (const instances_type *insts); NormalInstanceIteratorTraits (const instances_type *insts);
@@ -804,6 +847,8 @@ struct DB_PUBLIC TouchingInstanceIteratorTraits
typedef cell_inst_wp_tree_type::touching_iterator iter_wp_type; typedef cell_inst_wp_tree_type::touching_iterator iter_wp_type;
typedef stable_cell_inst_tree_type::touching_iterator stable_iter_type; typedef stable_cell_inst_tree_type::touching_iterator stable_iter_type;
typedef stable_cell_inst_wp_tree_type::touching_iterator stable_iter_wp_type; typedef stable_cell_inst_wp_tree_type::touching_iterator stable_iter_wp_type;
typedef stable_iter_type stable_unsorted_iter_type;
typedef stable_iter_wp_type stable_unsorted_iter_wp_type;
TouchingInstanceIteratorTraits (); TouchingInstanceIteratorTraits ();
TouchingInstanceIteratorTraits (const instances_type *insts, const box_type &box, const layout_type *layout); TouchingInstanceIteratorTraits (const instances_type *insts, const box_type &box, const layout_type *layout);
@@ -855,6 +900,8 @@ struct DB_PUBLIC OverlappingInstanceIteratorTraits
typedef cell_inst_wp_tree_type::overlapping_iterator iter_wp_type; typedef cell_inst_wp_tree_type::overlapping_iterator iter_wp_type;
typedef stable_cell_inst_tree_type::overlapping_iterator stable_iter_type; typedef stable_cell_inst_tree_type::overlapping_iterator stable_iter_type;
typedef stable_cell_inst_wp_tree_type::overlapping_iterator stable_iter_wp_type; typedef stable_cell_inst_wp_tree_type::overlapping_iterator stable_iter_wp_type;
typedef stable_iter_type stable_unsorted_iter_type;
typedef stable_iter_wp_type stable_unsorted_iter_wp_type;
OverlappingInstanceIteratorTraits (); OverlappingInstanceIteratorTraits ();
OverlappingInstanceIteratorTraits (const instances_type *insts, const box_type &box, const layout_type *layout); OverlappingInstanceIteratorTraits (const instances_type *insts, const box_type &box, const layout_type *layout);
@@ -1741,6 +1788,7 @@ private:
friend struct NormalInstanceIteratorTraits; friend struct NormalInstanceIteratorTraits;
friend struct TouchingInstanceIteratorTraits; friend struct TouchingInstanceIteratorTraits;
friend struct OverlappingInstanceIteratorTraits; friend struct OverlappingInstanceIteratorTraits;
template <class Traits> friend class instance_iterator;
template <class Inst, class ET> friend class InstOp; template <class Inst, class ET> friend class InstOp;
union { union {
@@ -1773,7 +1821,7 @@ private:
} }
/** /**
* @brief Sets a flag indicating that the instance tree needs sorting * @brief Gets a flag indicating that the instance tree needs sorting
*/ */
bool instance_tree_needs_sort () const bool instance_tree_needs_sort () const
{ {
+63
View File
@@ -28,6 +28,7 @@
#include "dbTextWriter.h" #include "dbTextWriter.h"
#include "dbCellMapping.h" #include "dbCellMapping.h"
#include "dbInstElement.h" #include "dbInstElement.h"
#include "dbWriter.h"
#include "tlString.h" #include "tlString.h"
#include "tlUnitTest.h" #include "tlUnitTest.h"
@@ -872,6 +873,68 @@ TEST(11_FindPath)
EXPECT_EQ (d, "cell_index=1 r90 *1 0,0;cell_index=2 r0 *1 100,200"); EXPECT_EQ (d, "cell_index=1 r90 *1 0,0;cell_index=2 r0 *1 100,200");
} }
// Shapes can be flat-iterated even in locked layout
TEST(12_ShapesInLockedLayout)
{
db::Layout l;
db::Cell &top = l.cell (l.add_cell ("TOP"));
unsigned int l1 = l.insert_layer (db::LayerProperties (1, 0));
{
db::LayoutLocker locker (&l);
EXPECT_EQ (l.under_construction (), true);
top.shapes (l1).insert (db::Box (1, 2, 3, 4));
top.shapes (l1).insert (db::Box (10, 20, 30, 40));
top.shapes (l1).insert (db::Box (100, 200, 300, 400));
double a = 0;
for (auto s = top.shapes (l1).begin (db::ShapeIterator::All); ! s.at_end (); ++s) {
a += s->area ();
}
EXPECT_EQ (a, 40404.0);
}
EXPECT_EQ (l.under_construction (), false);
double a = 0;
for (auto s = top.shapes (l1).begin (db::ShapeIterator::All); ! s.at_end (); ++s) {
a += s->area ();
}
EXPECT_EQ (a, 40404.0);
}
// Instances can be flat-iterated even in locked layout
TEST(13_InstancesInLockedLayout)
{
db::Layout l;
db::Cell &top = l.cell (l.add_cell ("TOP"));
db::Cell &c = l.cell (l.add_cell ("C"));
{
db::LayoutLocker locker (&l);
EXPECT_EQ (l.under_construction (), true);
top.insert (db::CellInstArray (c.cell_index (), db::Trans (db::Vector (10, 20))));
top.insert (db::CellInstArray (c.cell_index (), db::Trans (db::Vector (100, 200))));
top.insert (db::CellInstArray (c.cell_index (), db::Trans (db::Vector (1, 2))));
db::Vector a;
for (auto i = top.begin (); ! i.at_end (); ++i) {
a += i->cell_inst ().front ().disp ();
}
EXPECT_EQ (a.to_string (), "111,222");
}
EXPECT_EQ (l.under_construction (), false);
db::Vector a;
for (auto i = top.begin (); ! i.at_end (); ++i) {
a += i->cell_inst ().front ().disp ();
}
EXPECT_EQ (a.to_string (), "111,222");
}
// issue #1860 // issue #1860
TEST(100_UndoOfDeleteLayer) TEST(100_UndoOfDeleteLayer)
{ {