WIP: generalization of algorithms with local processor, include texts, edge pairs, edges

This commit is contained in:
Matthias Koefferlein 2020-09-27 23:57:17 +02:00
parent b464279dcf
commit 1b74607598
19 changed files with 234 additions and 357 deletions

View File

@ -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 &region, 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 ());

View File

@ -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 &region, 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;

View File

@ -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 &region, 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 ()
{

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 &region, 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;

View File

@ -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 &region, 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);
}
}

View File

@ -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 &region, 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;

View File

@ -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; }

View File

@ -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;

View File

@ -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