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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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