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 ..
|
* TODO: this is kind of redundant with OriginalLayerIterator ..
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC DeepEdgePairsIterator
|
class DB_PUBLIC DeepEdgePairsIterator
|
||||||
: public EdgePairsIteratorDelegate
|
: public EdgePairsIteratorDelegate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef db::EdgePair value_type;
|
||||||
|
|
||||||
DeepEdgePairsIterator (const db::RecursiveShapeIterator &iter)
|
DeepEdgePairsIterator (const db::RecursiveShapeIterator &iter)
|
||||||
: m_iter (iter)
|
: m_iter (iter)
|
||||||
{
|
{
|
||||||
|
|
@ -60,23 +62,46 @@ public:
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool is_addressable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual const value_type *get () const
|
virtual const value_type *get () const
|
||||||
{
|
{
|
||||||
return &m_edge_pair;
|
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
|
virtual EdgePairsIteratorDelegate *clone () const
|
||||||
{
|
{
|
||||||
return new DeepEdgePairsIterator (*this);
|
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:
|
private:
|
||||||
friend class EdgePairs;
|
friend class Texts;
|
||||||
|
|
||||||
db::RecursiveShapeIterator m_iter;
|
db::RecursiveShapeIterator m_iter;
|
||||||
mutable value_type m_edge_pair;
|
mutable value_type m_edge_pair;
|
||||||
|
|
||||||
void set () const {
|
void set () const
|
||||||
|
{
|
||||||
if (! m_iter.at_end ()) {
|
if (! m_iter.at_end ()) {
|
||||||
m_iter.shape ().edge_pair (m_edge_pair);
|
m_iter.shape ().edge_pair (m_edge_pair);
|
||||||
m_edge_pair.transform (m_iter.trans ());
|
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 ..
|
* TODO: this is kind of redundant with OriginalLayerIterator ..
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC DeepEdgesIterator
|
class DB_PUBLIC DeepEdgesIterator
|
||||||
: public EdgesIteratorDelegate
|
: public EdgesIteratorDelegate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef db::Edge value_type;
|
||||||
|
|
||||||
DeepEdgesIterator (const db::RecursiveShapeIterator &iter)
|
DeepEdgesIterator (const db::RecursiveShapeIterator &iter)
|
||||||
: m_iter (iter)
|
: m_iter (iter)
|
||||||
{
|
{
|
||||||
|
|
@ -67,18 +69,40 @@ public:
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool is_addressable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual const value_type *get () const
|
virtual const value_type *get () const
|
||||||
{
|
{
|
||||||
return &m_edge;
|
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
|
virtual EdgesIteratorDelegate *clone () const
|
||||||
{
|
{
|
||||||
return new DeepEdgesIterator (*this);
|
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:
|
private:
|
||||||
friend class Edges;
|
friend class Texts;
|
||||||
|
|
||||||
db::RecursiveShapeIterator m_iter;
|
db::RecursiveShapeIterator m_iter;
|
||||||
mutable value_type m_edge;
|
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 ..
|
* TODO: this is kind of redundant with OriginalLayerIterator ..
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC DeepTextsIterator
|
class DB_PUBLIC DeepTextsIterator
|
||||||
: public TextsIteratorDelegate
|
: public TextsIteratorDelegate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef db::Text value_type;
|
||||||
|
|
||||||
DeepTextsIterator (const db::RecursiveShapeIterator &iter)
|
DeepTextsIterator (const db::RecursiveShapeIterator &iter)
|
||||||
: m_iter (iter)
|
: m_iter (iter)
|
||||||
{
|
{
|
||||||
|
|
@ -65,23 +67,46 @@ public:
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool is_addressable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual const value_type *get () const
|
virtual const value_type *get () const
|
||||||
{
|
{
|
||||||
return &m_text;
|
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
|
virtual TextsIteratorDelegate *clone () const
|
||||||
{
|
{
|
||||||
return new DeepTextsIterator (*this);
|
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:
|
private:
|
||||||
friend class Texts;
|
friend class Texts;
|
||||||
|
|
||||||
db::RecursiveShapeIterator m_iter;
|
db::RecursiveShapeIterator m_iter;
|
||||||
mutable value_type m_text;
|
mutable value_type m_text;
|
||||||
|
|
||||||
void set () const {
|
void set () const
|
||||||
|
{
|
||||||
if (! m_iter.at_end ()) {
|
if (! m_iter.at_end ()) {
|
||||||
m_iter.shape ().text (m_text);
|
m_iter.shape ().text (m_text);
|
||||||
m_text.transform (m_iter.trans ());
|
m_text.transform (m_iter.trans ());
|
||||||
|
|
@ -89,7 +114,6 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
DeepTexts::DeepTexts ()
|
DeepTexts::DeepTexts ()
|
||||||
: AsIfFlatTexts ()
|
: AsIfFlatTexts ()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -48,20 +48,20 @@ class TransformationReducer;
|
||||||
*
|
*
|
||||||
* The iterator delivers the edge pairs of the edge pair set
|
* 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
|
class DB_PUBLIC EdgePairsIterator
|
||||||
|
: public generic_shape_iterator<db::EdgePair>
|
||||||
{
|
{
|
||||||
public:
|
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
|
* @brief Default constructor
|
||||||
*/
|
*/
|
||||||
EdgePairsIterator ()
|
EdgePairsIterator ()
|
||||||
: mp_delegate (0)
|
: generic_shape_iterator<db::EdgePair> ()
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -71,27 +71,18 @@ public:
|
||||||
* The iterator will take ownership over the delegate
|
* The iterator will take ownership over the delegate
|
||||||
*/
|
*/
|
||||||
EdgePairsIterator (EdgePairsIteratorDelegate *delegate)
|
EdgePairsIterator (EdgePairsIteratorDelegate *delegate)
|
||||||
: mp_delegate (delegate)
|
: generic_shape_iterator<db::EdgePair> (delegate)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Destructor
|
|
||||||
*/
|
|
||||||
~EdgePairsIterator ()
|
|
||||||
{
|
|
||||||
delete mp_delegate;
|
|
||||||
mp_delegate = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Copy constructor and assignment
|
* @brief Copy constructor and assignment
|
||||||
*/
|
*/
|
||||||
EdgePairsIterator (const EdgePairsIterator &other)
|
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)
|
EdgePairsIterator &operator= (const EdgePairsIterator &other)
|
||||||
{
|
{
|
||||||
if (this != &other) {
|
generic_shape_iterator<db::EdgePair>::operator= (other);
|
||||||
delete mp_delegate;
|
|
||||||
mp_delegate = other.mp_delegate ? other.mp_delegate->clone () : 0;
|
|
||||||
}
|
|
||||||
return *this;
|
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
|
* @brief Increment
|
||||||
*/
|
*/
|
||||||
EdgePairsIterator &operator++ ()
|
EdgePairsIterator &operator++ ()
|
||||||
{
|
{
|
||||||
if (mp_delegate) {
|
generic_shape_iterator<db::EdgePair>::operator++ ();
|
||||||
mp_delegate->increment ();
|
|
||||||
}
|
|
||||||
return *this;
|
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;
|
typedef addressable_shape_delivery_gen<EdgePairsIterator> AddressableEdgePairDelivery;
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@
|
||||||
#include "dbEdgePair.h"
|
#include "dbEdgePair.h"
|
||||||
#include "dbShapeCollection.h"
|
#include "dbShapeCollection.h"
|
||||||
#include "dbShapeCollectionUtils.h"
|
#include "dbShapeCollectionUtils.h"
|
||||||
|
#include "dbGenericShapeIterator.h"
|
||||||
|
|
||||||
namespace db {
|
namespace db {
|
||||||
|
|
||||||
|
|
@ -43,19 +44,7 @@ typedef shape_collection_processor<db::EdgePair, db::Polygon> EdgePairToPolygonP
|
||||||
/**
|
/**
|
||||||
* @brief The edge pair set iterator delegate
|
* @brief The edge pair set iterator delegate
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC EdgePairsIteratorDelegate
|
typedef db::generic_shape_iterator_delegate_base <db::EdgePair> 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The delegate for the actual edge set implementation
|
* @brief The delegate for the actual edge set implementation
|
||||||
|
|
|
||||||
|
|
@ -45,19 +45,14 @@ class DeepShapeStore;
|
||||||
* The iterator delivers the edges of the edge set
|
* The iterator delivers the edges of the edge set
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC EdgesIterator
|
class DB_PUBLIC EdgesIterator
|
||||||
|
: public generic_shape_iterator<db::Edge>
|
||||||
{
|
{
|
||||||
public:
|
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
|
* @brief Default constructor
|
||||||
*/
|
*/
|
||||||
EdgesIterator ()
|
EdgesIterator ()
|
||||||
: mp_delegate (0)
|
: generic_shape_iterator<db::Edge> ()
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -67,27 +62,18 @@ public:
|
||||||
* The iterator will take ownership over the delegate
|
* The iterator will take ownership over the delegate
|
||||||
*/
|
*/
|
||||||
EdgesIterator (EdgesIteratorDelegate *delegate)
|
EdgesIterator (EdgesIteratorDelegate *delegate)
|
||||||
: mp_delegate (delegate)
|
: generic_shape_iterator<db::Edge> (delegate)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Destructor
|
|
||||||
*/
|
|
||||||
~EdgesIterator ()
|
|
||||||
{
|
|
||||||
delete mp_delegate;
|
|
||||||
mp_delegate = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Copy constructor and assignment
|
* @brief Copy constructor and assignment
|
||||||
*/
|
*/
|
||||||
EdgesIterator (const EdgesIterator &other)
|
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)
|
EdgesIterator &operator= (const EdgesIterator &other)
|
||||||
{
|
{
|
||||||
if (this != &other) {
|
generic_shape_iterator<db::Edge>::operator= (other);
|
||||||
delete mp_delegate;
|
|
||||||
mp_delegate = other.mp_delegate ? other.mp_delegate->clone () : 0;
|
|
||||||
}
|
|
||||||
return *this;
|
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
|
* @brief Increment
|
||||||
*/
|
*/
|
||||||
EdgesIterator &operator++ ()
|
EdgesIterator &operator++ ()
|
||||||
{
|
{
|
||||||
if (mp_delegate) {
|
generic_shape_iterator<db::Edge>::operator++ ();
|
||||||
mp_delegate->increment ();
|
|
||||||
}
|
|
||||||
return *this;
|
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;
|
typedef addressable_shape_delivery_gen<EdgesIterator> AddressableEdgeDelivery;
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
#include "dbEdgePairRelations.h"
|
#include "dbEdgePairRelations.h"
|
||||||
#include "dbShapeCollection.h"
|
#include "dbShapeCollection.h"
|
||||||
#include "dbShapeCollectionUtils.h"
|
#include "dbShapeCollectionUtils.h"
|
||||||
|
#include "dbGenericShapeIterator.h"
|
||||||
|
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
|
@ -141,19 +142,7 @@ class RegionDelegate;
|
||||||
/**
|
/**
|
||||||
* @brief The edge set iterator delegate
|
* @brief The edge set iterator delegate
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC EdgesIteratorDelegate
|
typedef db::generic_shape_iterator_delegate_base <db::Edge> 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The delegate for the actual edge set implementation
|
* @brief The delegate for the actual edge set implementation
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ void FlatEdgePairs::reserve (size_t n)
|
||||||
|
|
||||||
EdgePairsIteratorDelegate *FlatEdgePairs::begin () const
|
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
|
std::pair<db::RecursiveShapeIterator, db::ICplxTrans> FlatEdgePairs::begin_iter () const
|
||||||
|
|
|
||||||
|
|
@ -28,50 +28,14 @@
|
||||||
|
|
||||||
#include "dbAsIfFlatEdgePairs.h"
|
#include "dbAsIfFlatEdgePairs.h"
|
||||||
#include "dbShapes.h"
|
#include "dbShapes.h"
|
||||||
|
#include "dbGenericShapeIterator.h"
|
||||||
|
|
||||||
namespace db {
|
namespace db {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief An iterator delegate for the flat edge pair set
|
* @brief An iterator delegate for the flat edge pair set
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC FlatEdgePairsIterator
|
typedef generic_shapes_iterator_delegate<db::EdgePair> 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The delegate for the actual edge pair set implementation
|
* @brief The delegate for the actual edge pair set implementation
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@ FlatEdges::ensure_merged_edges_valid () const
|
||||||
|
|
||||||
EdgesIteratorDelegate *FlatEdges::begin () 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
|
EdgesIteratorDelegate *FlatEdges::begin_merged () const
|
||||||
|
|
@ -142,7 +142,7 @@ EdgesIteratorDelegate *FlatEdges::begin_merged () const
|
||||||
return begin ();
|
return begin ();
|
||||||
} else {
|
} else {
|
||||||
ensure_merged_edges_valid ();
|
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 "dbAsIfFlatEdges.h"
|
||||||
#include "dbShapes.h"
|
#include "dbShapes.h"
|
||||||
#include "dbShapes2.h"
|
#include "dbShapes2.h"
|
||||||
|
#include "dbGenericShapeIterator.h"
|
||||||
|
|
||||||
namespace db {
|
namespace db {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief An iterator delegate for the flat region
|
* @brief An iterator delegate for the flat edge set
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC FlatEdgesIterator
|
typedef generic_shapes_iterator_delegate<db::Edge> 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief A flat, edge-set delegate
|
* @brief A flat, edge-set delegate
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ void FlatTexts::reserve (size_t n)
|
||||||
|
|
||||||
TextsIteratorDelegate *FlatTexts::begin () const
|
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
|
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
|
* @brief An iterator delegate for the flat text set
|
||||||
*/
|
*/
|
||||||
class DB_PUBLIC FlatTextsIterator
|
typedef generic_shapes_iterator_delegate<db::Text> 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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The delegate for the actual text set implementation
|
* @brief The delegate for the actual text set implementation
|
||||||
|
|
|
||||||
|
|
@ -38,12 +38,19 @@ namespace
|
||||||
: public EdgePairsIteratorDelegate
|
: public EdgePairsIteratorDelegate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef db::EdgePair value_type;
|
||||||
|
|
||||||
OriginalLayerEdgePairsIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
OriginalLayerEdgePairsIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
||||||
: m_rec_iter (iter), m_iter_trans (trans)
|
: m_rec_iter (iter), m_iter_trans (trans)
|
||||||
{
|
{
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool is_addressable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool at_end () const
|
virtual bool at_end () const
|
||||||
{
|
{
|
||||||
return m_rec_iter.at_end ();
|
return m_rec_iter.at_end ();
|
||||||
|
|
@ -51,13 +58,13 @@ namespace
|
||||||
|
|
||||||
virtual void increment ()
|
virtual void increment ()
|
||||||
{
|
{
|
||||||
inc ();
|
do_increment ();
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const value_type *get () const
|
virtual const value_type *get () const
|
||||||
{
|
{
|
||||||
return &m_edge_pair;
|
return &m_shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual EdgePairsIteratorDelegate *clone () const
|
virtual EdgePairsIteratorDelegate *clone () const
|
||||||
|
|
@ -65,25 +72,46 @@ namespace
|
||||||
return new OriginalLayerEdgePairsIterator (*this);
|
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:
|
private:
|
||||||
friend class EdgePairs;
|
friend class EdgePairs;
|
||||||
|
|
||||||
db::RecursiveShapeIterator m_rec_iter;
|
db::RecursiveShapeIterator m_rec_iter;
|
||||||
db::ICplxTrans m_iter_trans;
|
db::ICplxTrans m_iter_trans;
|
||||||
db::EdgePair m_edge_pair;
|
value_type m_shape;
|
||||||
|
|
||||||
void set ()
|
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;
|
++m_rec_iter;
|
||||||
}
|
}
|
||||||
if (! m_rec_iter.at_end ()) {
|
if (! m_rec_iter.at_end ()) {
|
||||||
m_rec_iter.shape ().edge_pair (m_edge_pair);
|
m_rec_iter.shape ().edge_pair (m_shape);
|
||||||
m_edge_pair.transform (m_iter_trans * m_rec_iter.trans ());
|
m_shape.transform (m_iter_trans * m_rec_iter.trans ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void inc ()
|
void do_increment ()
|
||||||
{
|
{
|
||||||
if (! m_rec_iter.at_end ()) {
|
if (! m_rec_iter.at_end ()) {
|
||||||
++m_rec_iter;
|
++m_rec_iter;
|
||||||
|
|
|
||||||
|
|
@ -39,12 +39,19 @@ namespace
|
||||||
: public EdgesIteratorDelegate
|
: public EdgesIteratorDelegate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef db::Edge value_type;
|
||||||
|
|
||||||
OriginalLayerEdgesIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
OriginalLayerEdgesIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
||||||
: m_rec_iter (iter), m_iter_trans (trans)
|
: m_rec_iter (iter), m_iter_trans (trans)
|
||||||
{
|
{
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool is_addressable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool at_end () const
|
virtual bool at_end () const
|
||||||
{
|
{
|
||||||
return m_rec_iter.at_end ();
|
return m_rec_iter.at_end ();
|
||||||
|
|
@ -52,13 +59,13 @@ namespace
|
||||||
|
|
||||||
virtual void increment ()
|
virtual void increment ()
|
||||||
{
|
{
|
||||||
inc ();
|
do_increment ();
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const value_type *get () const
|
virtual const value_type *get () const
|
||||||
{
|
{
|
||||||
return &m_edge;
|
return &m_shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual EdgesIteratorDelegate *clone () const
|
virtual EdgesIteratorDelegate *clone () const
|
||||||
|
|
@ -66,25 +73,46 @@ namespace
|
||||||
return new OriginalLayerEdgesIterator (*this);
|
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:
|
private:
|
||||||
friend class Edges;
|
friend class Edges;
|
||||||
|
|
||||||
db::RecursiveShapeIterator m_rec_iter;
|
db::RecursiveShapeIterator m_rec_iter;
|
||||||
db::ICplxTrans m_iter_trans;
|
db::ICplxTrans m_iter_trans;
|
||||||
db::Edge m_edge;
|
value_type m_shape;
|
||||||
|
|
||||||
void set ()
|
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;
|
++m_rec_iter;
|
||||||
}
|
}
|
||||||
if (! m_rec_iter.at_end ()) {
|
if (! m_rec_iter.at_end ()) {
|
||||||
m_rec_iter.shape ().edge (m_edge);
|
m_rec_iter.shape ().edge (m_shape);
|
||||||
m_edge.transform (m_iter_trans * m_rec_iter.trans ());
|
m_shape.transform (m_iter_trans * m_rec_iter.trans ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void inc ()
|
void do_increment ()
|
||||||
{
|
{
|
||||||
if (! m_rec_iter.at_end ()) {
|
if (! m_rec_iter.at_end ()) {
|
||||||
++m_rec_iter;
|
++m_rec_iter;
|
||||||
|
|
@ -159,7 +187,7 @@ OriginalLayerEdges::begin_merged () const
|
||||||
return begin ();
|
return begin ();
|
||||||
} else {
|
} else {
|
||||||
ensure_merged_edges_valid ();
|
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 TextsIteratorDelegate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
typedef db::Text value_type;
|
||||||
|
|
||||||
OriginalLayerTextsIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
OriginalLayerTextsIterator (const db::RecursiveShapeIterator &iter, const db::ICplxTrans &trans)
|
||||||
: m_rec_iter (iter), m_iter_trans (trans)
|
: m_rec_iter (iter), m_iter_trans (trans)
|
||||||
{
|
{
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool is_addressable() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool at_end () const
|
virtual bool at_end () const
|
||||||
{
|
{
|
||||||
return m_rec_iter.at_end ();
|
return m_rec_iter.at_end ();
|
||||||
|
|
@ -51,39 +58,60 @@ namespace
|
||||||
|
|
||||||
virtual void increment ()
|
virtual void increment ()
|
||||||
{
|
{
|
||||||
inc ();
|
do_increment ();
|
||||||
set ();
|
set ();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const value_type *get () const
|
virtual const value_type *get () const
|
||||||
{
|
{
|
||||||
return &m_text;
|
return &m_shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual TextsIteratorDelegate *clone () const
|
virtual OriginalLayerTextsIterator *clone () const
|
||||||
{
|
{
|
||||||
return new OriginalLayerTextsIterator (*this);
|
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:
|
private:
|
||||||
friend class Texts;
|
friend class Texts;
|
||||||
|
|
||||||
db::RecursiveShapeIterator m_rec_iter;
|
db::RecursiveShapeIterator m_rec_iter;
|
||||||
db::ICplxTrans m_iter_trans;
|
db::ICplxTrans m_iter_trans;
|
||||||
db::Text m_text;
|
value_type m_shape;
|
||||||
|
|
||||||
void set ()
|
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;
|
++m_rec_iter;
|
||||||
}
|
}
|
||||||
if (! m_rec_iter.at_end ()) {
|
if (! m_rec_iter.at_end ()) {
|
||||||
m_rec_iter.shape ().text (m_text);
|
m_rec_iter.shape ().text (m_shape);
|
||||||
m_text.transform (m_iter_trans * m_rec_iter.trans ());
|
m_shape.transform (m_iter_trans * m_rec_iter.trans ());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void inc ()
|
void do_increment ()
|
||||||
{
|
{
|
||||||
if (! m_rec_iter.at_end ()) {
|
if (! m_rec_iter.at_end ()) {
|
||||||
++m_rec_iter;
|
++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<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_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<db::Text> () { return db::ShapeIterator::Texts; }
|
||||||
template <> inline unsigned int shape_flags_pure<db::Text> () { return 1 << db::ShapeIterator::Text; }
|
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
|
* The iterator delivers the texts of the text set
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class DB_PUBLIC TextsIterator
|
class DB_PUBLIC TextsIterator
|
||||||
|
: public generic_shape_iterator<db::Text>
|
||||||
{
|
{
|
||||||
public:
|
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
|
* @brief Default constructor
|
||||||
*/
|
*/
|
||||||
TextsIterator ()
|
TextsIterator ()
|
||||||
: mp_delegate (0)
|
: generic_shape_iterator<db::Text> ()
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
@ -71,27 +67,18 @@ public:
|
||||||
* The iterator will take ownership over the delegate
|
* The iterator will take ownership over the delegate
|
||||||
*/
|
*/
|
||||||
TextsIterator (TextsIteratorDelegate *delegate)
|
TextsIterator (TextsIteratorDelegate *delegate)
|
||||||
: mp_delegate (delegate)
|
: generic_shape_iterator<db::Text> (delegate)
|
||||||
{
|
{
|
||||||
// .. nothing yet ..
|
// .. nothing yet ..
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Destructor
|
|
||||||
*/
|
|
||||||
~TextsIterator ()
|
|
||||||
{
|
|
||||||
delete mp_delegate;
|
|
||||||
mp_delegate = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Copy constructor and assignment
|
* @brief Copy constructor and assignment
|
||||||
*/
|
*/
|
||||||
TextsIterator (const TextsIterator &other)
|
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)
|
TextsIterator &operator= (const TextsIterator &other)
|
||||||
{
|
{
|
||||||
if (this != &other) {
|
generic_shape_iterator<db::Text>::operator= (other);
|
||||||
delete mp_delegate;
|
|
||||||
mp_delegate = other.mp_delegate ? other.mp_delegate->clone () : 0;
|
|
||||||
}
|
|
||||||
return *this;
|
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
|
* @brief Increment
|
||||||
*/
|
*/
|
||||||
TextsIterator &operator++ ()
|
TextsIterator &operator++ ()
|
||||||
{
|
{
|
||||||
if (mp_delegate) {
|
generic_shape_iterator<db::Text>::operator++ ();
|
||||||
mp_delegate->increment ();
|
|
||||||
}
|
|
||||||
return *this;
|
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;
|
typedef addressable_shape_delivery_gen<TextsIterator> AddressableTextDelivery;
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@
|
||||||
#include "dbCommon.h"
|
#include "dbCommon.h"
|
||||||
#include "dbShapeCollection.h"
|
#include "dbShapeCollection.h"
|
||||||
#include "dbShapeCollectionUtils.h"
|
#include "dbShapeCollectionUtils.h"
|
||||||
|
#include "dbGenericShapeIterator.h"
|
||||||
#include "dbText.h"
|
#include "dbText.h"
|
||||||
|
|
||||||
namespace db {
|
namespace db {
|
||||||
|
|
@ -41,22 +42,7 @@ class Layout;
|
||||||
|
|
||||||
typedef shape_collection_processor<db::Text, db::Polygon> TextToPolygonProcessorBase;
|
typedef shape_collection_processor<db::Text, db::Polygon> TextToPolygonProcessorBase;
|
||||||
|
|
||||||
/**
|
typedef db::generic_shape_iterator_delegate_base <db::Text> TextsIteratorDelegate;
|
||||||
* @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;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The delegate for the actual edge set implementation
|
* @brief The delegate for the actual edge set implementation
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue