From 1b7460759808db37fe0f6fdfedb33ee521d97b04 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 27 Sep 2020 23:57:17 +0200 Subject: [PATCH] WIP: generalization of algorithms with local processor, include texts, edge pairs, edges --- src/db/db/dbDeepEdgePairs.cc | 31 +++++++++++-- src/db/db/dbDeepEdges.cc | 28 ++++++++++- src/db/db/dbDeepTexts.cc | 30 ++++++++++-- src/db/db/dbEdgePairs.h | 67 +++++---------------------- src/db/db/dbEdgePairsDelegate.h | 15 +----- src/db/db/dbEdges.h | 62 +++---------------------- src/db/db/dbEdgesDelegate.h | 15 +----- src/db/db/dbFlatEdgePairs.cc | 2 +- src/db/db/dbFlatEdgePairs.h | 40 +--------------- src/db/db/dbFlatEdges.cc | 4 +- src/db/db/dbFlatEdges.h | 42 ++--------------- src/db/db/dbFlatTexts.cc | 2 +- src/db/db/dbFlatTexts.h | 39 +--------------- src/db/db/dbOriginalLayerEdgePairs.cc | 42 ++++++++++++++--- src/db/db/dbOriginalLayerEdges.cc | 44 ++++++++++++++---- src/db/db/dbOriginalLayerTexts.cc | 44 ++++++++++++++---- src/db/db/dbShapeFlags.h | 3 ++ src/db/db/dbTexts.h | 63 ++++--------------------- src/db/db/dbTextsDelegate.h | 18 +------ 19 files changed, 234 insertions(+), 357 deletions(-) diff --git a/src/db/db/dbDeepEdgePairs.cc b/src/db/db/dbDeepEdgePairs.cc index 00e2702f9..200ae1456 100644 --- a/src/db/db/dbDeepEdgePairs.cc +++ b/src/db/db/dbDeepEdgePairs.cc @@ -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 *other) const + { + const DeepEdgePairsIterator *o = dynamic_cast (other); + return o && o->m_iter == m_iter; + } + virtual EdgePairsIteratorDelegate *clone () const { return new DeepEdgePairsIterator (*this); } + virtual void do_reset (const db::Box ®ion, bool overlapping) + { + m_iter.set_region (region); + m_iter.set_overlapping (overlapping); + } + + virtual db::Box bbox () const + { + return m_iter.bbox (); + } + private: - friend class EdgePairs; + friend class Texts; db::RecursiveShapeIterator m_iter; mutable value_type m_edge_pair; - void set () const { + void set () const + { if (! m_iter.at_end ()) { m_iter.shape ().edge_pair (m_edge_pair); m_edge_pair.transform (m_iter.trans ()); diff --git a/src/db/db/dbDeepEdges.cc b/src/db/db/dbDeepEdges.cc index 981f65381..069b39bc6 100644 --- a/src/db/db/dbDeepEdges.cc +++ b/src/db/db/dbDeepEdges.cc @@ -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 *other) const + { + const DeepEdgesIterator *o = dynamic_cast (other); + return o && o->m_iter == m_iter; + } + virtual EdgesIteratorDelegate *clone () const { return new DeepEdgesIterator (*this); } + virtual void do_reset (const db::Box ®ion, bool overlapping) + { + m_iter.set_region (region); + m_iter.set_overlapping (overlapping); + } + + virtual db::Box bbox () const + { + return m_iter.bbox (); + } + private: - friend class Edges; + friend class Texts; db::RecursiveShapeIterator m_iter; mutable value_type m_edge; diff --git a/src/db/db/dbDeepTexts.cc b/src/db/db/dbDeepTexts.cc index 9516fc94e..605fd1533 100644 --- a/src/db/db/dbDeepTexts.cc +++ b/src/db/db/dbDeepTexts.cc @@ -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 *other) const + { + const DeepTextsIterator *o = dynamic_cast (other); + return o && o->m_iter == m_iter; + } + virtual TextsIteratorDelegate *clone () const { return new DeepTextsIterator (*this); } + virtual void do_reset (const db::Box ®ion, bool overlapping) + { + m_iter.set_region (region); + m_iter.set_overlapping (overlapping); + } + + virtual db::Box bbox () const + { + return m_iter.bbox (); + } + private: friend class Texts; db::RecursiveShapeIterator m_iter; mutable value_type m_text; - void set () const { + void set () const + { if (! m_iter.at_end ()) { m_iter.shape ().text (m_text); m_text.transform (m_iter.trans ()); @@ -89,7 +114,6 @@ private: } }; - DeepTexts::DeepTexts () : AsIfFlatTexts () { diff --git a/src/db/db/dbEdgePairs.h b/src/db/db/dbEdgePairs.h index c3cc8c056..d666f347f 100644 --- a/src/db/db/dbEdgePairs.h +++ b/src/db/db/dbEdgePairs.h @@ -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 { 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 () { // .. nothing yet .. } @@ -71,27 +71,18 @@ public: * The iterator will take ownership over the delegate */ EdgePairsIterator (EdgePairsIteratorDelegate *delegate) - : mp_delegate (delegate) + : generic_shape_iterator (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 (static_cast &> (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::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::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 AddressableEdgePairDelivery; diff --git a/src/db/db/dbEdgePairsDelegate.h b/src/db/db/dbEdgePairsDelegate.h index 83378446b..fb176de54 100644 --- a/src/db/db/dbEdgePairsDelegate.h +++ b/src/db/db/dbEdgePairsDelegate.h @@ -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 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 EdgePairsIteratorDelegate; /** * @brief The delegate for the actual edge set implementation diff --git a/src/db/db/dbEdges.h b/src/db/db/dbEdges.h index 17420cc7d..76e15d764 100644 --- a/src/db/db/dbEdges.h +++ b/src/db/db/dbEdges.h @@ -45,19 +45,14 @@ class DeepShapeStore; * The iterator delivers the edges of the edge set */ class DB_PUBLIC EdgesIterator + : public generic_shape_iterator { 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 () { // .. nothing yet .. } @@ -67,27 +62,18 @@ public: * The iterator will take ownership over the delegate */ EdgesIterator (EdgesIteratorDelegate *delegate) - : mp_delegate (delegate) + : generic_shape_iterator (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 (static_cast &> (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::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::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 AddressableEdgeDelivery; diff --git a/src/db/db/dbEdgesDelegate.h b/src/db/db/dbEdgesDelegate.h index 6175dd69a..122e6aa02 100644 --- a/src/db/db/dbEdgesDelegate.h +++ b/src/db/db/dbEdgesDelegate.h @@ -31,6 +31,7 @@ #include "dbEdgePairRelations.h" #include "dbShapeCollection.h" #include "dbShapeCollectionUtils.h" +#include "dbGenericShapeIterator.h" #include @@ -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 EdgesIteratorDelegate; /** * @brief The delegate for the actual edge set implementation diff --git a/src/db/db/dbFlatEdgePairs.cc b/src/db/db/dbFlatEdgePairs.cc index 405b51ec0..a45ff7992 100644 --- a/src/db/db/dbFlatEdgePairs.cc +++ b/src/db/db/dbFlatEdgePairs.cc @@ -66,7 +66,7 @@ void FlatEdgePairs::reserve (size_t n) EdgePairsIteratorDelegate *FlatEdgePairs::begin () const { - return new FlatEdgePairsIterator (m_edge_pairs.get_layer ().begin (), m_edge_pairs.get_layer ().end ()); + return new FlatEdgePairsIterator (&m_edge_pairs); } std::pair FlatEdgePairs::begin_iter () const diff --git a/src/db/db/dbFlatEdgePairs.h b/src/db/db/dbFlatEdgePairs.h index dfab48947..b5ff02a58 100644 --- a/src/db/db/dbFlatEdgePairs.h +++ b/src/db/db/dbFlatEdgePairs.h @@ -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 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 FlatEdgePairsIterator; /** * @brief The delegate for the actual edge pair set implementation diff --git a/src/db/db/dbFlatEdges.cc b/src/db/db/dbFlatEdges.cc index b81a095dd..2bb575615 100644 --- a/src/db/db/dbFlatEdges.cc +++ b/src/db/db/dbFlatEdges.cc @@ -133,7 +133,7 @@ FlatEdges::ensure_merged_edges_valid () const EdgesIteratorDelegate *FlatEdges::begin () const { - return new FlatEdgesIterator (m_edges.get_layer ().begin (), m_edges.get_layer ().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 ().begin (), m_merged_edges.get_layer ().end ()); + return new FlatEdgesIterator (&m_merged_edges); } } diff --git a/src/db/db/dbFlatEdges.h b/src/db/db/dbFlatEdges.h index 90378b78e..457d32f91 100644 --- a/src/db/db/dbFlatEdges.h +++ b/src/db/db/dbFlatEdges.h @@ -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 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 FlatEdgesIterator; /** * @brief A flat, edge-set delegate diff --git a/src/db/db/dbFlatTexts.cc b/src/db/db/dbFlatTexts.cc index 96668a150..fb6985f4b 100644 --- a/src/db/db/dbFlatTexts.cc +++ b/src/db/db/dbFlatTexts.cc @@ -66,7 +66,7 @@ void FlatTexts::reserve (size_t n) TextsIteratorDelegate *FlatTexts::begin () const { - return new FlatTextsIterator (m_texts.get_layer ().begin (), m_texts.get_layer ().end ()); + return new FlatTextsIterator (&m_texts); } std::pair FlatTexts::begin_iter () const diff --git a/src/db/db/dbFlatTexts.h b/src/db/db/dbFlatTexts.h index 90b3e9b24..fe8c5e34f 100644 --- a/src/db/db/dbFlatTexts.h +++ b/src/db/db/dbFlatTexts.h @@ -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 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 FlatTextsIterator; /** * @brief The delegate for the actual text set implementation diff --git a/src/db/db/dbOriginalLayerEdgePairs.cc b/src/db/db/dbOriginalLayerEdgePairs.cc index 2c8668204..a6907a0af 100644 --- a/src/db/db/dbOriginalLayerEdgePairs.cc +++ b/src/db/db/dbOriginalLayerEdgePairs.cc @@ -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 *other) const + { + const OriginalLayerEdgePairsIterator *o = dynamic_cast (other); + return o && o->m_rec_iter == m_rec_iter && o->m_iter_trans.equal (m_iter_trans); + } + + virtual void do_reset (const db::Box ®ion, bool overlapping) + { + if (region == db::Box::world ()) { + m_rec_iter.set_region (region); + } else { + m_rec_iter.set_region (m_iter_trans.inverted () * region); + } + m_rec_iter.set_overlapping (overlapping); + } + + virtual db::Box bbox () const + { + return m_iter_trans * m_rec_iter.bbox (); + } + private: friend class EdgePairs; db::RecursiveShapeIterator m_rec_iter; db::ICplxTrans m_iter_trans; - db::EdgePair m_edge_pair; + value_type m_shape; void set () { - while (! m_rec_iter.at_end () && ! m_rec_iter.shape ().is_edge_pair ()) { + while (! m_rec_iter.at_end () && !m_rec_iter.shape ().is_edge_pair ()) { ++m_rec_iter; } if (! m_rec_iter.at_end ()) { - m_rec_iter.shape ().edge_pair (m_edge_pair); - m_edge_pair.transform (m_iter_trans * m_rec_iter.trans ()); + m_rec_iter.shape ().edge_pair (m_shape); + m_shape.transform (m_iter_trans * m_rec_iter.trans ()); } } - void inc () + void do_increment () { if (! m_rec_iter.at_end ()) { ++m_rec_iter; diff --git a/src/db/db/dbOriginalLayerEdges.cc b/src/db/db/dbOriginalLayerEdges.cc index 54b1242db..8e66b5583 100644 --- a/src/db/db/dbOriginalLayerEdges.cc +++ b/src/db/db/dbOriginalLayerEdges.cc @@ -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 *other) const + { + const OriginalLayerEdgesIterator *o = dynamic_cast (other); + return o && o->m_rec_iter == m_rec_iter && o->m_iter_trans.equal (m_iter_trans); + } + + virtual void do_reset (const db::Box ®ion, bool overlapping) + { + if (region == db::Box::world ()) { + m_rec_iter.set_region (region); + } else { + m_rec_iter.set_region (m_iter_trans.inverted () * region); + } + m_rec_iter.set_overlapping (overlapping); + } + + virtual db::Box bbox () const + { + return m_iter_trans * m_rec_iter.bbox (); + } + private: friend class Edges; db::RecursiveShapeIterator m_rec_iter; db::ICplxTrans m_iter_trans; - db::Edge m_edge; + value_type m_shape; void set () { - while (! m_rec_iter.at_end () && ! (m_rec_iter.shape ().is_edge () || m_rec_iter.shape ().is_path () || m_rec_iter.shape ().is_box ())) { + while (! m_rec_iter.at_end () && !m_rec_iter.shape ().is_edge ()) { ++m_rec_iter; } if (! m_rec_iter.at_end ()) { - m_rec_iter.shape ().edge (m_edge); - m_edge.transform (m_iter_trans * m_rec_iter.trans ()); + m_rec_iter.shape ().edge (m_shape); + m_shape.transform (m_iter_trans * m_rec_iter.trans ()); } } - void inc () + void do_increment () { if (! m_rec_iter.at_end ()) { ++m_rec_iter; @@ -159,7 +187,7 @@ OriginalLayerEdges::begin_merged () const return begin (); } else { ensure_merged_edges_valid (); - return new FlatEdgesIterator (m_merged_edges.get_layer ().begin (), m_merged_edges.get_layer ().end ()); + return new FlatEdgesIterator (&m_merged_edges); } } diff --git a/src/db/db/dbOriginalLayerTexts.cc b/src/db/db/dbOriginalLayerTexts.cc index ceb8534fd..3ad474650 100644 --- a/src/db/db/dbOriginalLayerTexts.cc +++ b/src/db/db/dbOriginalLayerTexts.cc @@ -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 *other) const + { + const OriginalLayerTextsIterator *o = dynamic_cast (other); + return o && o->m_rec_iter == m_rec_iter && o->m_iter_trans.equal (m_iter_trans); + } + + virtual void do_reset (const db::Box ®ion, bool overlapping) + { + if (region == db::Box::world ()) { + m_rec_iter.set_region (region); + } else { + m_rec_iter.set_region (m_iter_trans.inverted () * region); + } + m_rec_iter.set_overlapping (overlapping); + } + + virtual db::Box bbox () const + { + return m_iter_trans * m_rec_iter.bbox (); + } + private: friend class Texts; db::RecursiveShapeIterator m_rec_iter; db::ICplxTrans m_iter_trans; - db::Text m_text; + value_type m_shape; void set () { - while (! m_rec_iter.at_end () && ! m_rec_iter.shape ().is_text ()) { + while (! m_rec_iter.at_end () && !m_rec_iter.shape ().is_text ()) { ++m_rec_iter; } if (! m_rec_iter.at_end ()) { - m_rec_iter.shape ().text (m_text); - m_text.transform (m_iter_trans * m_rec_iter.trans ()); + m_rec_iter.shape ().text (m_shape); + m_shape.transform (m_iter_trans * m_rec_iter.trans ()); } } - void inc () + void do_increment () { if (! m_rec_iter.at_end ()) { ++m_rec_iter; diff --git a/src/db/db/dbShapeFlags.h b/src/db/db/dbShapeFlags.h index e68918d8d..10547ccd2 100644 --- a/src/db/db/dbShapeFlags.h +++ b/src/db/db/dbShapeFlags.h @@ -51,6 +51,9 @@ template <> inline unsigned int shape_flags_pure () { return 1 < template <> inline unsigned int shape_flags () { return db::ShapeIterator::Edges; } template <> inline unsigned int shape_flags_pure () { return 1 << db::ShapeIterator::Edge; } +template <> inline unsigned int shape_flags () { return db::ShapeIterator::EdgePairs; } +template <> inline unsigned int shape_flags_pure () { return 1 << db::ShapeIterator::EdgePair; } + template <> inline unsigned int shape_flags () { return db::ShapeIterator::Texts; } template <> inline unsigned int shape_flags_pure () { return 1 << db::ShapeIterator::Text; } diff --git a/src/db/db/dbTexts.h b/src/db/db/dbTexts.h index 6493aab6d..118d06d03 100644 --- a/src/db/db/dbTexts.h +++ b/src/db/db/dbTexts.h @@ -48,20 +48,16 @@ class TransformationReducer; * * The iterator delivers the texts of the text set */ + class DB_PUBLIC TextsIterator + : public generic_shape_iterator { 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 () { // .. nothing yet .. } @@ -71,27 +67,18 @@ public: * The iterator will take ownership over the delegate */ TextsIterator (TextsIteratorDelegate *delegate) - : mp_delegate (delegate) + : generic_shape_iterator (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 (static_cast &> (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::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::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 AddressableTextDelivery; diff --git a/src/db/db/dbTextsDelegate.h b/src/db/db/dbTextsDelegate.h index 300be5c82..afbd3de54 100644 --- a/src/db/db/dbTextsDelegate.h +++ b/src/db/db/dbTextsDelegate.h @@ -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 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 TextsIteratorDelegate; /** * @brief The delegate for the actual edge set implementation