mirror of https://github.com/KLayout/klayout.git
WIP: generalization of algorithms with local processor, include texts, edge pairs, edges
This commit is contained in:
parent
b464279dcf
commit
1b74607598
|
|
@ -34,13 +34,15 @@ namespace db
|
|||
{
|
||||
|
||||
/**
|
||||
* @brief An iterator delegate for the deep edge pair collection
|
||||
* @brief An iterator delegate for the deep region
|
||||
* TODO: this is kind of redundant with OriginalLayerIterator ..
|
||||
*/
|
||||
class DB_PUBLIC DeepEdgePairsIterator
|
||||
: public EdgePairsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::EdgePair value_type;
|
||||
|
||||
DeepEdgePairsIterator (const db::RecursiveShapeIterator &iter)
|
||||
: m_iter (iter)
|
||||
{
|
||||
|
|
@ -60,23 +62,46 @@ public:
|
|||
set ();
|
||||
}
|
||||
|
||||
virtual bool is_addressable() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return &m_edge_pair;
|
||||
}
|
||||
|
||||
virtual bool equals (const generic_shape_iterator_delegate_base<value_type> *other) const
|
||||
{
|
||||
const DeepEdgePairsIterator *o = dynamic_cast<const DeepEdgePairsIterator *> (other);
|
||||
return o && o->m_iter == m_iter;
|
||||
}
|
||||
|
||||
virtual EdgePairsIteratorDelegate *clone () const
|
||||
{
|
||||
return new DeepEdgePairsIterator (*this);
|
||||
}
|
||||
|
||||
virtual void do_reset (const db::Box ®ion, bool overlapping)
|
||||
{
|
||||
m_iter.set_region (region);
|
||||
m_iter.set_overlapping (overlapping);
|
||||
}
|
||||
|
||||
virtual db::Box bbox () const
|
||||
{
|
||||
return m_iter.bbox ();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class EdgePairs;
|
||||
friend class Texts;
|
||||
|
||||
db::RecursiveShapeIterator m_iter;
|
||||
mutable value_type m_edge_pair;
|
||||
|
||||
void set () const {
|
||||
void set () const
|
||||
{
|
||||
if (! m_iter.at_end ()) {
|
||||
m_iter.shape ().edge_pair (m_edge_pair);
|
||||
m_edge_pair.transform (m_iter.trans ());
|
||||
|
|
|
|||
|
|
@ -41,13 +41,15 @@ namespace db
|
|||
{
|
||||
|
||||
/**
|
||||
* @brief An iterator delegate for the deep edge collection
|
||||
* @brief An iterator delegate for the deep region
|
||||
* TODO: this is kind of redundant with OriginalLayerIterator ..
|
||||
*/
|
||||
class DB_PUBLIC DeepEdgesIterator
|
||||
: public EdgesIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::Edge value_type;
|
||||
|
||||
DeepEdgesIterator (const db::RecursiveShapeIterator &iter)
|
||||
: m_iter (iter)
|
||||
{
|
||||
|
|
@ -67,18 +69,40 @@ public:
|
|||
set ();
|
||||
}
|
||||
|
||||
virtual bool is_addressable() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return &m_edge;
|
||||
}
|
||||
|
||||
virtual bool equals (const generic_shape_iterator_delegate_base<value_type> *other) const
|
||||
{
|
||||
const DeepEdgesIterator *o = dynamic_cast<const DeepEdgesIterator *> (other);
|
||||
return o && o->m_iter == m_iter;
|
||||
}
|
||||
|
||||
virtual EdgesIteratorDelegate *clone () const
|
||||
{
|
||||
return new DeepEdgesIterator (*this);
|
||||
}
|
||||
|
||||
virtual void do_reset (const db::Box ®ion, bool overlapping)
|
||||
{
|
||||
m_iter.set_region (region);
|
||||
m_iter.set_overlapping (overlapping);
|
||||
}
|
||||
|
||||
virtual db::Box bbox () const
|
||||
{
|
||||
return m_iter.bbox ();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Edges;
|
||||
friend class Texts;
|
||||
|
||||
db::RecursiveShapeIterator m_iter;
|
||||
mutable value_type m_edge;
|
||||
|
|
|
|||
|
|
@ -39,13 +39,15 @@ namespace db
|
|||
{
|
||||
|
||||
/**
|
||||
* @brief An iterator delegate for the deep text collection
|
||||
* @brief An iterator delegate for the deep region
|
||||
* TODO: this is kind of redundant with OriginalLayerIterator ..
|
||||
*/
|
||||
class DB_PUBLIC DeepTextsIterator
|
||||
: public TextsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::Text value_type;
|
||||
|
||||
DeepTextsIterator (const db::RecursiveShapeIterator &iter)
|
||||
: m_iter (iter)
|
||||
{
|
||||
|
|
@ -65,23 +67,46 @@ public:
|
|||
set ();
|
||||
}
|
||||
|
||||
virtual bool is_addressable() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return &m_text;
|
||||
}
|
||||
|
||||
virtual bool equals (const generic_shape_iterator_delegate_base<value_type> *other) const
|
||||
{
|
||||
const DeepTextsIterator *o = dynamic_cast<const DeepTextsIterator *> (other);
|
||||
return o && o->m_iter == m_iter;
|
||||
}
|
||||
|
||||
virtual TextsIteratorDelegate *clone () const
|
||||
{
|
||||
return new DeepTextsIterator (*this);
|
||||
}
|
||||
|
||||
virtual void do_reset (const db::Box ®ion, bool overlapping)
|
||||
{
|
||||
m_iter.set_region (region);
|
||||
m_iter.set_overlapping (overlapping);
|
||||
}
|
||||
|
||||
virtual db::Box bbox () const
|
||||
{
|
||||
return m_iter.bbox ();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Texts;
|
||||
|
||||
db::RecursiveShapeIterator m_iter;
|
||||
mutable value_type m_text;
|
||||
|
||||
void set () const {
|
||||
void set () const
|
||||
{
|
||||
if (! m_iter.at_end ()) {
|
||||
m_iter.shape ().text (m_text);
|
||||
m_text.transform (m_iter.trans ());
|
||||
|
|
@ -89,7 +114,6 @@ private:
|
|||
}
|
||||
};
|
||||
|
||||
|
||||
DeepTexts::DeepTexts ()
|
||||
: AsIfFlatTexts ()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -48,20 +48,20 @@ class TransformationReducer;
|
|||
*
|
||||
* The iterator delivers the edge pairs of the edge pair set
|
||||
*/
|
||||
/**
|
||||
* @brief An edge set iterator
|
||||
*
|
||||
* The iterator delivers the edges of the edge set
|
||||
*/
|
||||
class DB_PUBLIC EdgePairsIterator
|
||||
: public generic_shape_iterator<db::EdgePair>
|
||||
{
|
||||
public:
|
||||
typedef EdgePairsIteratorDelegate::value_type value_type;
|
||||
typedef const value_type &reference;
|
||||
typedef const value_type *pointer;
|
||||
typedef std::forward_iterator_tag iterator_category;
|
||||
typedef void difference_type;
|
||||
|
||||
/**
|
||||
* @brief Default constructor
|
||||
*/
|
||||
EdgePairsIterator ()
|
||||
: mp_delegate (0)
|
||||
: generic_shape_iterator<db::EdgePair> ()
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
|
@ -71,27 +71,18 @@ public:
|
|||
* The iterator will take ownership over the delegate
|
||||
*/
|
||||
EdgePairsIterator (EdgePairsIteratorDelegate *delegate)
|
||||
: mp_delegate (delegate)
|
||||
: generic_shape_iterator<db::EdgePair> (delegate)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~EdgePairsIterator ()
|
||||
{
|
||||
delete mp_delegate;
|
||||
mp_delegate = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Copy constructor and assignment
|
||||
*/
|
||||
EdgePairsIterator (const EdgePairsIterator &other)
|
||||
: mp_delegate (0)
|
||||
: generic_shape_iterator<db::EdgePair> (static_cast<const generic_shape_iterator<db::EdgePair> &> (other))
|
||||
{
|
||||
operator= (other);
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -99,52 +90,18 @@ public:
|
|||
*/
|
||||
EdgePairsIterator &operator= (const EdgePairsIterator &other)
|
||||
{
|
||||
if (this != &other) {
|
||||
delete mp_delegate;
|
||||
mp_delegate = other.mp_delegate ? other.mp_delegate->clone () : 0;
|
||||
}
|
||||
generic_shape_iterator<db::EdgePair>::operator= (other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Returns true, if the iterator is at the end
|
||||
*/
|
||||
bool at_end () const
|
||||
{
|
||||
return mp_delegate == 0 || mp_delegate->at_end ();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Increment
|
||||
*/
|
||||
EdgePairsIterator &operator++ ()
|
||||
{
|
||||
if (mp_delegate) {
|
||||
mp_delegate->increment ();
|
||||
}
|
||||
generic_shape_iterator<db::EdgePair>::operator++ ();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access
|
||||
*/
|
||||
reference operator* () const
|
||||
{
|
||||
const value_type *value = operator-> ();
|
||||
tl_assert (value != 0);
|
||||
return *value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access
|
||||
*/
|
||||
pointer operator-> () const
|
||||
{
|
||||
return mp_delegate ? mp_delegate->get () : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
EdgePairsIteratorDelegate *mp_delegate;
|
||||
};
|
||||
|
||||
typedef addressable_shape_delivery_gen<EdgePairsIterator> AddressableEdgePairDelivery;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include "dbEdgePair.h"
|
||||
#include "dbShapeCollection.h"
|
||||
#include "dbShapeCollectionUtils.h"
|
||||
#include "dbGenericShapeIterator.h"
|
||||
|
||||
namespace db {
|
||||
|
||||
|
|
@ -43,19 +44,7 @@ typedef shape_collection_processor<db::EdgePair, db::Polygon> EdgePairToPolygonP
|
|||
/**
|
||||
* @brief The edge pair set iterator delegate
|
||||
*/
|
||||
class DB_PUBLIC EdgePairsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
EdgePairsIteratorDelegate () { }
|
||||
virtual ~EdgePairsIteratorDelegate () { }
|
||||
|
||||
typedef db::EdgePair value_type;
|
||||
|
||||
virtual bool at_end () const = 0;
|
||||
virtual void increment () = 0;
|
||||
virtual const value_type *get () const = 0;
|
||||
virtual EdgePairsIteratorDelegate *clone () const = 0;
|
||||
};
|
||||
typedef db::generic_shape_iterator_delegate_base <db::EdgePair> EdgePairsIteratorDelegate;
|
||||
|
||||
/**
|
||||
* @brief The delegate for the actual edge set implementation
|
||||
|
|
|
|||
|
|
@ -45,19 +45,14 @@ class DeepShapeStore;
|
|||
* The iterator delivers the edges of the edge set
|
||||
*/
|
||||
class DB_PUBLIC EdgesIterator
|
||||
: public generic_shape_iterator<db::Edge>
|
||||
{
|
||||
public:
|
||||
typedef EdgesIteratorDelegate::value_type value_type;
|
||||
typedef const value_type &reference;
|
||||
typedef const value_type *pointer;
|
||||
typedef std::forward_iterator_tag iterator_category;
|
||||
typedef void difference_type;
|
||||
|
||||
/**
|
||||
* @brief Default constructor
|
||||
*/
|
||||
EdgesIterator ()
|
||||
: mp_delegate (0)
|
||||
: generic_shape_iterator<db::Edge> ()
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
|
@ -67,27 +62,18 @@ public:
|
|||
* The iterator will take ownership over the delegate
|
||||
*/
|
||||
EdgesIterator (EdgesIteratorDelegate *delegate)
|
||||
: mp_delegate (delegate)
|
||||
: generic_shape_iterator<db::Edge> (delegate)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~EdgesIterator ()
|
||||
{
|
||||
delete mp_delegate;
|
||||
mp_delegate = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Copy constructor and assignment
|
||||
*/
|
||||
EdgesIterator (const EdgesIterator &other)
|
||||
: mp_delegate (0)
|
||||
: generic_shape_iterator<db::Edge> (static_cast<const generic_shape_iterator<db::Edge> &> (other))
|
||||
{
|
||||
operator= (other);
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -95,52 +81,18 @@ public:
|
|||
*/
|
||||
EdgesIterator &operator= (const EdgesIterator &other)
|
||||
{
|
||||
if (this != &other) {
|
||||
delete mp_delegate;
|
||||
mp_delegate = other.mp_delegate ? other.mp_delegate->clone () : 0;
|
||||
}
|
||||
generic_shape_iterator<db::Edge>::operator= (other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Returns true, if the iterator is at the end
|
||||
*/
|
||||
bool at_end () const
|
||||
{
|
||||
return mp_delegate == 0 || mp_delegate->at_end ();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Increment
|
||||
*/
|
||||
EdgesIterator &operator++ ()
|
||||
{
|
||||
if (mp_delegate) {
|
||||
mp_delegate->increment ();
|
||||
}
|
||||
generic_shape_iterator<db::Edge>::operator++ ();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access
|
||||
*/
|
||||
reference operator* () const
|
||||
{
|
||||
const value_type *value = operator-> ();
|
||||
tl_assert (value != 0);
|
||||
return *value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access
|
||||
*/
|
||||
pointer operator-> () const
|
||||
{
|
||||
return mp_delegate ? mp_delegate->get () : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
EdgesIteratorDelegate *mp_delegate;
|
||||
};
|
||||
|
||||
typedef addressable_shape_delivery_gen<EdgesIterator> AddressableEdgeDelivery;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include "dbEdgePairRelations.h"
|
||||
#include "dbShapeCollection.h"
|
||||
#include "dbShapeCollectionUtils.h"
|
||||
#include "dbGenericShapeIterator.h"
|
||||
|
||||
#include <list>
|
||||
|
||||
|
|
@ -141,19 +142,7 @@ class RegionDelegate;
|
|||
/**
|
||||
* @brief The edge set iterator delegate
|
||||
*/
|
||||
class DB_PUBLIC EdgesIteratorDelegate
|
||||
{
|
||||
public:
|
||||
EdgesIteratorDelegate () { }
|
||||
virtual ~EdgesIteratorDelegate () { }
|
||||
|
||||
typedef db::Edge value_type;
|
||||
|
||||
virtual bool at_end () const = 0;
|
||||
virtual void increment () = 0;
|
||||
virtual const value_type *get () const = 0;
|
||||
virtual EdgesIteratorDelegate *clone () const = 0;
|
||||
};
|
||||
typedef db::generic_shape_iterator_delegate_base <db::Edge> EdgesIteratorDelegate;
|
||||
|
||||
/**
|
||||
* @brief The delegate for the actual edge set implementation
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ void FlatEdgePairs::reserve (size_t n)
|
|||
|
||||
EdgePairsIteratorDelegate *FlatEdgePairs::begin () const
|
||||
{
|
||||
return new FlatEdgePairsIterator (m_edge_pairs.get_layer<db::EdgePair, db::unstable_layer_tag> ().begin (), m_edge_pairs.get_layer<db::EdgePair, db::unstable_layer_tag> ().end ());
|
||||
return new FlatEdgePairsIterator (&m_edge_pairs);
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans> FlatEdgePairs::begin_iter () const
|
||||
|
|
|
|||
|
|
@ -28,50 +28,14 @@
|
|||
|
||||
#include "dbAsIfFlatEdgePairs.h"
|
||||
#include "dbShapes.h"
|
||||
#include "dbGenericShapeIterator.h"
|
||||
|
||||
namespace db {
|
||||
|
||||
/**
|
||||
* @brief An iterator delegate for the flat edge pair set
|
||||
*/
|
||||
class DB_PUBLIC FlatEdgePairsIterator
|
||||
: public EdgePairsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::layer<db::EdgePair, db::unstable_layer_tag> edge_pair_layer_type;
|
||||
typedef edge_pair_layer_type::iterator iterator_type;
|
||||
|
||||
FlatEdgePairsIterator (iterator_type from, iterator_type to)
|
||||
: m_from (from), m_to (to)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
virtual bool at_end () const
|
||||
{
|
||||
return m_from == m_to;
|
||||
}
|
||||
|
||||
virtual void increment ()
|
||||
{
|
||||
++m_from;
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return m_from.operator-> ();
|
||||
}
|
||||
|
||||
virtual EdgePairsIteratorDelegate *clone () const
|
||||
{
|
||||
return new FlatEdgePairsIterator (*this);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class EdgePairs;
|
||||
|
||||
iterator_type m_from, m_to;
|
||||
};
|
||||
typedef generic_shapes_iterator_delegate<db::EdgePair> FlatEdgePairsIterator;
|
||||
|
||||
/**
|
||||
* @brief The delegate for the actual edge pair set implementation
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ FlatEdges::ensure_merged_edges_valid () const
|
|||
|
||||
EdgesIteratorDelegate *FlatEdges::begin () const
|
||||
{
|
||||
return new FlatEdgesIterator (m_edges.get_layer<db::Edge, db::unstable_layer_tag> ().begin (), m_edges.get_layer<db::Edge, db::unstable_layer_tag> ().end ());
|
||||
return new FlatEdgesIterator (&m_edges);
|
||||
}
|
||||
|
||||
EdgesIteratorDelegate *FlatEdges::begin_merged () const
|
||||
|
|
@ -142,7 +142,7 @@ EdgesIteratorDelegate *FlatEdges::begin_merged () const
|
|||
return begin ();
|
||||
} else {
|
||||
ensure_merged_edges_valid ();
|
||||
return new FlatEdgesIterator (m_merged_edges.get_layer<db::Edge, db::unstable_layer_tag> ().begin (), m_merged_edges.get_layer<db::Edge, db::unstable_layer_tag> ().end ());
|
||||
return new FlatEdgesIterator (&m_merged_edges);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,50 +29,14 @@
|
|||
#include "dbAsIfFlatEdges.h"
|
||||
#include "dbShapes.h"
|
||||
#include "dbShapes2.h"
|
||||
#include "dbGenericShapeIterator.h"
|
||||
|
||||
namespace db {
|
||||
|
||||
/**
|
||||
* @brief An iterator delegate for the flat region
|
||||
* @brief An iterator delegate for the flat edge set
|
||||
*/
|
||||
class DB_PUBLIC FlatEdgesIterator
|
||||
: public EdgesIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::layer<db::Edge, db::unstable_layer_tag> edge_layer_type;
|
||||
typedef edge_layer_type::iterator iterator_type;
|
||||
|
||||
FlatEdgesIterator (iterator_type from, iterator_type to)
|
||||
: m_from (from), m_to (to)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
virtual bool at_end () const
|
||||
{
|
||||
return m_from == m_to;
|
||||
}
|
||||
|
||||
virtual void increment ()
|
||||
{
|
||||
++m_from;
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return m_from.operator-> ();
|
||||
}
|
||||
|
||||
virtual EdgesIteratorDelegate *clone () const
|
||||
{
|
||||
return new FlatEdgesIterator (*this);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Edges;
|
||||
|
||||
iterator_type m_from, m_to;
|
||||
};
|
||||
typedef generic_shapes_iterator_delegate<db::Edge> FlatEdgesIterator;
|
||||
|
||||
/**
|
||||
* @brief A flat, edge-set delegate
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ void FlatTexts::reserve (size_t n)
|
|||
|
||||
TextsIteratorDelegate *FlatTexts::begin () const
|
||||
{
|
||||
return new FlatTextsIterator (m_texts.get_layer<db::Text, db::unstable_layer_tag> ().begin (), m_texts.get_layer<db::Text, db::unstable_layer_tag> ().end ());
|
||||
return new FlatTextsIterator (&m_texts);
|
||||
}
|
||||
|
||||
std::pair<db::RecursiveShapeIterator, db::ICplxTrans> FlatTexts::begin_iter () const
|
||||
|
|
|
|||
|
|
@ -34,44 +34,7 @@ namespace db {
|
|||
/**
|
||||
* @brief An iterator delegate for the flat text set
|
||||
*/
|
||||
class DB_PUBLIC FlatTextsIterator
|
||||
: public TextsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::layer<db::Text, db::unstable_layer_tag> edge_pair_layer_type;
|
||||
typedef edge_pair_layer_type::iterator iterator_type;
|
||||
|
||||
FlatTextsIterator (iterator_type from, iterator_type to)
|
||||
: m_from (from), m_to (to)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
virtual bool at_end () const
|
||||
{
|
||||
return m_from == m_to;
|
||||
}
|
||||
|
||||
virtual void increment ()
|
||||
{
|
||||
++m_from;
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return m_from.operator-> ();
|
||||
}
|
||||
|
||||
virtual TextsIteratorDelegate *clone () const
|
||||
{
|
||||
return new FlatTextsIterator (*this);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Texts;
|
||||
|
||||
iterator_type m_from, m_to;
|
||||
};
|
||||
typedef generic_shapes_iterator_delegate<db::Text> FlatTextsIterator;
|
||||
|
||||
/**
|
||||
* @brief The delegate for the actual text set implementation
|
||||
|
|
|
|||
|
|
@ -38,12 +38,19 @@ namespace
|
|||
: public EdgePairsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::EdgePair value_type;
|
||||
|
||||
OriginalLayerEdgePairsIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
||||
: m_rec_iter (iter), m_iter_trans (trans)
|
||||
{
|
||||
set ();
|
||||
}
|
||||
|
||||
virtual bool is_addressable() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool at_end () const
|
||||
{
|
||||
return m_rec_iter.at_end ();
|
||||
|
|
@ -51,13 +58,13 @@ namespace
|
|||
|
||||
virtual void increment ()
|
||||
{
|
||||
inc ();
|
||||
do_increment ();
|
||||
set ();
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return &m_edge_pair;
|
||||
return &m_shape;
|
||||
}
|
||||
|
||||
virtual EdgePairsIteratorDelegate *clone () const
|
||||
|
|
@ -65,25 +72,46 @@ namespace
|
|||
return new OriginalLayerEdgePairsIterator (*this);
|
||||
}
|
||||
|
||||
virtual bool equals (const generic_shape_iterator_delegate_base<value_type> *other) const
|
||||
{
|
||||
const OriginalLayerEdgePairsIterator *o = dynamic_cast<const OriginalLayerEdgePairsIterator *> (other);
|
||||
return o && o->m_rec_iter == m_rec_iter && o->m_iter_trans.equal (m_iter_trans);
|
||||
}
|
||||
|
||||
virtual void do_reset (const db::Box ®ion, bool overlapping)
|
||||
{
|
||||
if (region == db::Box::world ()) {
|
||||
m_rec_iter.set_region (region);
|
||||
} else {
|
||||
m_rec_iter.set_region (m_iter_trans.inverted () * region);
|
||||
}
|
||||
m_rec_iter.set_overlapping (overlapping);
|
||||
}
|
||||
|
||||
virtual db::Box bbox () const
|
||||
{
|
||||
return m_iter_trans * m_rec_iter.bbox ();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class EdgePairs;
|
||||
|
||||
db::RecursiveShapeIterator m_rec_iter;
|
||||
db::ICplxTrans m_iter_trans;
|
||||
db::EdgePair m_edge_pair;
|
||||
value_type m_shape;
|
||||
|
||||
void set ()
|
||||
{
|
||||
while (! m_rec_iter.at_end () && ! m_rec_iter.shape ().is_edge_pair ()) {
|
||||
while (! m_rec_iter.at_end () && !m_rec_iter.shape ().is_edge_pair ()) {
|
||||
++m_rec_iter;
|
||||
}
|
||||
if (! m_rec_iter.at_end ()) {
|
||||
m_rec_iter.shape ().edge_pair (m_edge_pair);
|
||||
m_edge_pair.transform (m_iter_trans * m_rec_iter.trans ());
|
||||
m_rec_iter.shape ().edge_pair (m_shape);
|
||||
m_shape.transform (m_iter_trans * m_rec_iter.trans ());
|
||||
}
|
||||
}
|
||||
|
||||
void inc ()
|
||||
void do_increment ()
|
||||
{
|
||||
if (! m_rec_iter.at_end ()) {
|
||||
++m_rec_iter;
|
||||
|
|
|
|||
|
|
@ -39,12 +39,19 @@ namespace
|
|||
: public EdgesIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::Edge value_type;
|
||||
|
||||
OriginalLayerEdgesIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
||||
: m_rec_iter (iter), m_iter_trans (trans)
|
||||
{
|
||||
set ();
|
||||
}
|
||||
|
||||
virtual bool is_addressable() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool at_end () const
|
||||
{
|
||||
return m_rec_iter.at_end ();
|
||||
|
|
@ -52,13 +59,13 @@ namespace
|
|||
|
||||
virtual void increment ()
|
||||
{
|
||||
inc ();
|
||||
do_increment ();
|
||||
set ();
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return &m_edge;
|
||||
return &m_shape;
|
||||
}
|
||||
|
||||
virtual EdgesIteratorDelegate *clone () const
|
||||
|
|
@ -66,25 +73,46 @@ namespace
|
|||
return new OriginalLayerEdgesIterator (*this);
|
||||
}
|
||||
|
||||
virtual bool equals (const generic_shape_iterator_delegate_base<value_type> *other) const
|
||||
{
|
||||
const OriginalLayerEdgesIterator *o = dynamic_cast<const OriginalLayerEdgesIterator *> (other);
|
||||
return o && o->m_rec_iter == m_rec_iter && o->m_iter_trans.equal (m_iter_trans);
|
||||
}
|
||||
|
||||
virtual void do_reset (const db::Box ®ion, bool overlapping)
|
||||
{
|
||||
if (region == db::Box::world ()) {
|
||||
m_rec_iter.set_region (region);
|
||||
} else {
|
||||
m_rec_iter.set_region (m_iter_trans.inverted () * region);
|
||||
}
|
||||
m_rec_iter.set_overlapping (overlapping);
|
||||
}
|
||||
|
||||
virtual db::Box bbox () const
|
||||
{
|
||||
return m_iter_trans * m_rec_iter.bbox ();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Edges;
|
||||
|
||||
db::RecursiveShapeIterator m_rec_iter;
|
||||
db::ICplxTrans m_iter_trans;
|
||||
db::Edge m_edge;
|
||||
value_type m_shape;
|
||||
|
||||
void set ()
|
||||
{
|
||||
while (! m_rec_iter.at_end () && ! (m_rec_iter.shape ().is_edge () || m_rec_iter.shape ().is_path () || m_rec_iter.shape ().is_box ())) {
|
||||
while (! m_rec_iter.at_end () && !m_rec_iter.shape ().is_edge ()) {
|
||||
++m_rec_iter;
|
||||
}
|
||||
if (! m_rec_iter.at_end ()) {
|
||||
m_rec_iter.shape ().edge (m_edge);
|
||||
m_edge.transform (m_iter_trans * m_rec_iter.trans ());
|
||||
m_rec_iter.shape ().edge (m_shape);
|
||||
m_shape.transform (m_iter_trans * m_rec_iter.trans ());
|
||||
}
|
||||
}
|
||||
|
||||
void inc ()
|
||||
void do_increment ()
|
||||
{
|
||||
if (! m_rec_iter.at_end ()) {
|
||||
++m_rec_iter;
|
||||
|
|
@ -159,7 +187,7 @@ OriginalLayerEdges::begin_merged () const
|
|||
return begin ();
|
||||
} else {
|
||||
ensure_merged_edges_valid ();
|
||||
return new FlatEdgesIterator (m_merged_edges.get_layer<db::Edge, db::unstable_layer_tag> ().begin (), m_merged_edges.get_layer<db::Edge, db::unstable_layer_tag> ().end ());
|
||||
return new FlatEdgesIterator (&m_merged_edges);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,12 +38,19 @@ namespace
|
|||
: public TextsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
typedef db::Text value_type;
|
||||
|
||||
OriginalLayerTextsIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
||||
: m_rec_iter (iter), m_iter_trans (trans)
|
||||
{
|
||||
set ();
|
||||
}
|
||||
|
||||
virtual bool is_addressable() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
virtual bool at_end () const
|
||||
{
|
||||
return m_rec_iter.at_end ();
|
||||
|
|
@ -51,39 +58,60 @@ namespace
|
|||
|
||||
virtual void increment ()
|
||||
{
|
||||
inc ();
|
||||
do_increment ();
|
||||
set ();
|
||||
}
|
||||
|
||||
virtual const value_type *get () const
|
||||
{
|
||||
return &m_text;
|
||||
return &m_shape;
|
||||
}
|
||||
|
||||
virtual TextsIteratorDelegate *clone () const
|
||||
virtual OriginalLayerTextsIterator *clone () const
|
||||
{
|
||||
return new OriginalLayerTextsIterator (*this);
|
||||
}
|
||||
|
||||
virtual bool equals (const generic_shape_iterator_delegate_base<value_type> *other) const
|
||||
{
|
||||
const OriginalLayerTextsIterator *o = dynamic_cast<const OriginalLayerTextsIterator *> (other);
|
||||
return o && o->m_rec_iter == m_rec_iter && o->m_iter_trans.equal (m_iter_trans);
|
||||
}
|
||||
|
||||
virtual void do_reset (const db::Box ®ion, bool overlapping)
|
||||
{
|
||||
if (region == db::Box::world ()) {
|
||||
m_rec_iter.set_region (region);
|
||||
} else {
|
||||
m_rec_iter.set_region (m_iter_trans.inverted () * region);
|
||||
}
|
||||
m_rec_iter.set_overlapping (overlapping);
|
||||
}
|
||||
|
||||
virtual db::Box bbox () const
|
||||
{
|
||||
return m_iter_trans * m_rec_iter.bbox ();
|
||||
}
|
||||
|
||||
private:
|
||||
friend class Texts;
|
||||
|
||||
db::RecursiveShapeIterator m_rec_iter;
|
||||
db::ICplxTrans m_iter_trans;
|
||||
db::Text m_text;
|
||||
value_type m_shape;
|
||||
|
||||
void set ()
|
||||
{
|
||||
while (! m_rec_iter.at_end () && ! m_rec_iter.shape ().is_text ()) {
|
||||
while (! m_rec_iter.at_end () && !m_rec_iter.shape ().is_text ()) {
|
||||
++m_rec_iter;
|
||||
}
|
||||
if (! m_rec_iter.at_end ()) {
|
||||
m_rec_iter.shape ().text (m_text);
|
||||
m_text.transform (m_iter_trans * m_rec_iter.trans ());
|
||||
m_rec_iter.shape ().text (m_shape);
|
||||
m_shape.transform (m_iter_trans * m_rec_iter.trans ());
|
||||
}
|
||||
}
|
||||
|
||||
void inc ()
|
||||
void do_increment ()
|
||||
{
|
||||
if (! m_rec_iter.at_end ()) {
|
||||
++m_rec_iter;
|
||||
|
|
|
|||
|
|
@ -51,6 +51,9 @@ template <> inline unsigned int shape_flags_pure<db::Polygon> () { return 1 <
|
|||
template <> inline unsigned int shape_flags<db::Edge> () { return db::ShapeIterator::Edges; }
|
||||
template <> inline unsigned int shape_flags_pure<db::Edge> () { return 1 << db::ShapeIterator::Edge; }
|
||||
|
||||
template <> inline unsigned int shape_flags<db::EdgePair> () { return db::ShapeIterator::EdgePairs; }
|
||||
template <> inline unsigned int shape_flags_pure<db::EdgePair> () { return 1 << db::ShapeIterator::EdgePair; }
|
||||
|
||||
template <> inline unsigned int shape_flags<db::Text> () { return db::ShapeIterator::Texts; }
|
||||
template <> inline unsigned int shape_flags_pure<db::Text> () { return 1 << db::ShapeIterator::Text; }
|
||||
|
||||
|
|
|
|||
|
|
@ -48,20 +48,16 @@ class TransformationReducer;
|
|||
*
|
||||
* The iterator delivers the texts of the text set
|
||||
*/
|
||||
|
||||
class DB_PUBLIC TextsIterator
|
||||
: public generic_shape_iterator<db::Text>
|
||||
{
|
||||
public:
|
||||
typedef TextsIteratorDelegate::value_type value_type;
|
||||
typedef const value_type &reference;
|
||||
typedef const value_type *pointer;
|
||||
typedef std::forward_iterator_tag iterator_category;
|
||||
typedef void difference_type;
|
||||
|
||||
/**
|
||||
* @brief Default constructor
|
||||
*/
|
||||
TextsIterator ()
|
||||
: mp_delegate (0)
|
||||
: generic_shape_iterator<db::Text> ()
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
|
@ -71,27 +67,18 @@ public:
|
|||
* The iterator will take ownership over the delegate
|
||||
*/
|
||||
TextsIterator (TextsIteratorDelegate *delegate)
|
||||
: mp_delegate (delegate)
|
||||
: generic_shape_iterator<db::Text> (delegate)
|
||||
{
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Destructor
|
||||
*/
|
||||
~TextsIterator ()
|
||||
{
|
||||
delete mp_delegate;
|
||||
mp_delegate = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Copy constructor and assignment
|
||||
*/
|
||||
TextsIterator (const TextsIterator &other)
|
||||
: mp_delegate (0)
|
||||
: generic_shape_iterator<db::Text> (static_cast<const generic_shape_iterator<db::Text> &> (other))
|
||||
{
|
||||
operator= (other);
|
||||
// .. nothing yet ..
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -99,52 +86,18 @@ public:
|
|||
*/
|
||||
TextsIterator &operator= (const TextsIterator &other)
|
||||
{
|
||||
if (this != &other) {
|
||||
delete mp_delegate;
|
||||
mp_delegate = other.mp_delegate ? other.mp_delegate->clone () : 0;
|
||||
}
|
||||
generic_shape_iterator<db::Text>::operator= (other);
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @Returns true, if the iterator is at the end
|
||||
*/
|
||||
bool at_end () const
|
||||
{
|
||||
return mp_delegate == 0 || mp_delegate->at_end ();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Increment
|
||||
*/
|
||||
TextsIterator &operator++ ()
|
||||
{
|
||||
if (mp_delegate) {
|
||||
mp_delegate->increment ();
|
||||
}
|
||||
generic_shape_iterator<db::Text>::operator++ ();
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access
|
||||
*/
|
||||
reference operator* () const
|
||||
{
|
||||
const value_type *value = operator-> ();
|
||||
tl_assert (value != 0);
|
||||
return *value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access
|
||||
*/
|
||||
pointer operator-> () const
|
||||
{
|
||||
return mp_delegate ? mp_delegate->get () : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
TextsIteratorDelegate *mp_delegate;
|
||||
};
|
||||
|
||||
typedef addressable_shape_delivery_gen<TextsIterator> AddressableTextDelivery;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include "dbCommon.h"
|
||||
#include "dbShapeCollection.h"
|
||||
#include "dbShapeCollectionUtils.h"
|
||||
#include "dbGenericShapeIterator.h"
|
||||
#include "dbText.h"
|
||||
|
||||
namespace db {
|
||||
|
|
@ -41,22 +42,7 @@ class Layout;
|
|||
|
||||
typedef shape_collection_processor<db::Text, db::Polygon> TextToPolygonProcessorBase;
|
||||
|
||||
/**
|
||||
* @brief The edge pair set iterator delegate
|
||||
*/
|
||||
class DB_PUBLIC TextsIteratorDelegate
|
||||
{
|
||||
public:
|
||||
TextsIteratorDelegate () { }
|
||||
virtual ~TextsIteratorDelegate () { }
|
||||
|
||||
typedef db::Text value_type;
|
||||
|
||||
virtual bool at_end () const = 0;
|
||||
virtual void increment () = 0;
|
||||
virtual const value_type *get () const = 0;
|
||||
virtual TextsIteratorDelegate *clone () const = 0;
|
||||
};
|
||||
typedef db::generic_shape_iterator_delegate_base <db::Text> TextsIteratorDelegate;
|
||||
|
||||
/**
|
||||
* @brief The delegate for the actual edge set implementation
|
||||
|
|
|
|||
Loading…
Reference in New Issue