From d0172d57f3f70b24390ff7122c48ae7668ef4130 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 18 Nov 2023 19:12:13 +0100 Subject: [PATCH] Further optimization/refactoring --- src/db/db/dbCellVariants.cc | 37 ++++++++++++++++++++++++++++++++ src/db/db/dbCellVariants.h | 8 +++++++ src/db/db/dbCompoundOperation.cc | 9 ++++++++ src/db/db/dbCompoundOperation.h | 3 +++ 4 files changed, 57 insertions(+) diff --git a/src/db/db/dbCellVariants.cc b/src/db/db/dbCellVariants.cc index a71d9eb52..9e274d6c5 100644 --- a/src/db/db/dbCellVariants.cc +++ b/src/db/db/dbCellVariants.cc @@ -43,6 +43,11 @@ db::Trans OrientationReducer::reduce (const db::Trans &trans) const return db::Trans (trans.fp_trans ()); } +bool OrientationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans OrthogonalTransformationReducer::reduce (const db::ICplxTrans &trans) const @@ -63,6 +68,11 @@ db::Trans OrthogonalTransformationReducer::reduce (const db::Trans &) const return db::Trans (); } +bool OrthogonalTransformationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans MagnificationReducer::reduce (const db::ICplxTrans &trans) const @@ -75,6 +85,11 @@ db::Trans MagnificationReducer::reduce (const db::Trans &) const return db::Trans (); } +bool MagnificationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans XYAnisotropyAndMagnificationReducer::reduce (const db::ICplxTrans &trans) const @@ -91,6 +106,11 @@ db::Trans XYAnisotropyAndMagnificationReducer::reduce (const db::Trans &trans) c return db::Trans (trans.angle () % 2, false, db::Vector ()); } +bool XYAnisotropyAndMagnificationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ db::ICplxTrans MagnificationAndOrientationReducer::reduce (const db::ICplxTrans &trans) const @@ -105,6 +125,11 @@ db::Trans MagnificationAndOrientationReducer::reduce (const db::Trans &trans) co return db::Trans (trans.fp_trans ()); } +bool MagnificationAndOrientationReducer::equals (const TransformationReducer *other) const +{ + return dynamic_cast (other) != 0; +} + // ------------------------------------------------------------------------------------------ GridReducer::GridReducer (db::Coord grid) @@ -130,6 +155,12 @@ db::Trans GridReducer::reduce (const db::Trans &trans) const return res; } +bool GridReducer::equals (const TransformationReducer *other) const +{ + const GridReducer *red = dynamic_cast (other); + return red != 0 && red->m_grid == m_grid; +} + // ------------------------------------------------------------------------------------------ ScaleAndGridReducer::ScaleAndGridReducer (db::Coord grid, db::Coord mult, db::Coord div) @@ -174,6 +205,12 @@ db::Trans ScaleAndGridReducer::reduce (const db::Trans &trans) const return res; } +bool ScaleAndGridReducer::equals (const TransformationReducer *other) const +{ + const ScaleAndGridReducer *red = dynamic_cast (other); + return red != 0 && red->m_grid == m_grid && red->m_mult == m_mult; +} + // ------------------------------------------------------------------------------------------ VariantsCollectorBase::VariantsCollectorBase () diff --git a/src/db/db/dbCellVariants.h b/src/db/db/dbCellVariants.h index aebbfd5b1..798771a6f 100644 --- a/src/db/db/dbCellVariants.h +++ b/src/db/db/dbCellVariants.h @@ -54,6 +54,7 @@ public: virtual db::ICplxTrans reduce_trans (const db::ICplxTrans &trans) const { return reduce (trans); } virtual db::Trans reduce (const db::Trans &trans) const = 0; virtual db::ICplxTrans reduce (const db::ICplxTrans &trans) const = 0; + virtual bool equals (const TransformationReducer *other) const = 0; virtual bool is_translation_invariant () const { return true; } }; @@ -67,6 +68,7 @@ struct DB_PUBLIC OrientationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -77,6 +79,7 @@ struct DB_PUBLIC OrthogonalTransformationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -89,6 +92,7 @@ struct DB_PUBLIC MagnificationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -101,6 +105,7 @@ struct DB_PUBLIC XYAnisotropyAndMagnificationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -113,6 +118,7 @@ struct DB_PUBLIC MagnificationAndOrientationReducer { db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; }; /** @@ -127,6 +133,7 @@ struct DB_PUBLIC GridReducer db::ICplxTrans reduce (const db::ICplxTrans &trans) const; db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; bool is_translation_invariant () const { return false; } @@ -150,6 +157,7 @@ struct DB_PUBLIC ScaleAndGridReducer virtual db::Trans reduce_trans (const db::Trans &trans) const; virtual db::ICplxTrans reduce (const db::ICplxTrans &trans) const; virtual db::Trans reduce (const db::Trans &trans) const; + virtual bool equals (const TransformationReducer *other) const; bool is_translation_invariant () const { return false; } diff --git a/src/db/db/dbCompoundOperation.cc b/src/db/db/dbCompoundOperation.cc index 0efbde07a..2601d98ec 100644 --- a/src/db/db/dbCompoundOperation.cc +++ b/src/db/db/dbCompoundOperation.cc @@ -236,7 +236,16 @@ void CompoundTransformationReducer::add (const db::TransformationReducer *reducer) { if (reducer) { + + // do not add the same reducer twice + for (auto v = m_vars.begin (); v != m_vars.end (); ++v) { + if (reducer->equals (*v)) { + return; + } + } + m_vars.push_back (reducer); + } } diff --git a/src/db/db/dbCompoundOperation.h b/src/db/db/dbCompoundOperation.h index 7c13a67e0..953768c18 100644 --- a/src/db/db/dbCompoundOperation.h +++ b/src/db/db/dbCompoundOperation.h @@ -431,6 +431,9 @@ public: virtual db::ICplxTrans reduce (const db::ICplxTrans &trans) const; virtual bool is_translation_invariant () const; + // NOTE: equality does not really matter here as we use it only on leaf reducers + virtual bool equals (const TransformationReducer *other) const { return false; } + private: std::vector m_vars; };