From a71cff888bb1fcc2bd0ff0dbf267227c1ddcf43a Mon Sep 17 00:00:00 2001
From: Matthias Puchner <github@mpuchner.de>
Date: Sun, 5 Dec 2021 09:45:09 +0100
Subject: [PATCH] simplify sample validator; reduce SessionItem usage

---
 GUI/Model/Sample/SampleValidator.cpp | 119 +++++++--------------------
 GUI/Model/Sample/SampleValidator.h   |  15 +---
 2 files changed, 36 insertions(+), 98 deletions(-)

diff --git a/GUI/Model/Sample/SampleValidator.cpp b/GUI/Model/Sample/SampleValidator.cpp
index d62ddf10c03..ceeaf7cfa0a 100644
--- a/GUI/Model/Sample/SampleValidator.cpp
+++ b/GUI/Model/Sample/SampleValidator.cpp
@@ -19,19 +19,6 @@
 #include "GUI/Model/Sample/ParticleCoreShellItem.h"
 #include "GUI/Model/Sample/ParticleLayoutItem.h"
 
-#include <boost/polymorphic_cast.hpp>
-
-using boost::polymorphic_cast;
-using boost::polymorphic_downcast;
-
-SampleValidator::SampleValidator() : m_valid_sample(true) {}
-
-void SampleValidator::initValidator()
-{
-    m_validation_message.clear();
-    m_valid_sample = true;
-}
-
 void SampleValidator::iterateItems(const SessionItem* parentItem)
 {
     for (const SessionItem* child : parentItem->children()) {
@@ -42,87 +29,45 @@ void SampleValidator::iterateItems(const SessionItem* parentItem)
 
 void SampleValidator::validateItem(const SessionItem* item)
 {
-    if (!item)
-        return;
-
-    QString diagnosis;
-
-    if (item->hasModelType<MultiLayerItem>())
-        diagnosis = validateMultiLayerItem(polymorphic_downcast<const MultiLayerItem*>(item));
-    else if (item->hasModelType<ParticleLayoutItem>()) {
-        diagnosis =
-            validateParticleLayoutItem(polymorphic_downcast<const ParticleLayoutItem*>(item));
-    } else if (item->hasModelType<ParticleCoreShellItem>()) {
-        diagnosis =
-            validateParticleCoreShellItem(polymorphic_cast<const ParticleCoreShellItem*>(item));
-    } else if (item->hasModelType<ParticleCompositionItem>()) {
-        diagnosis =
-            validateParticleCompositionItem(polymorphic_cast<const ParticleCompositionItem*>(item));
-    }
-    if (!diagnosis.isEmpty()) {
-        m_valid_sample = false;
-        m_validation_message += QString("* ") + diagnosis + "\n";
-    }
+    if (auto* p = dynamic_cast<const ParticleCoreShellItem*>(item)) {
+        if (!p->core())
+            addMessage("Core/shell particle doesn't have core defined.");
+        if (!p->shell())
+            addMessage("Core/shell particle doesn't have shell defined.");
+    } else if (auto* p = dynamic_cast<const ParticleCompositionItem*>(item))
+        if (p->particles().isEmpty())
+            addMessage("Particle composition doesn't have any particles.");
 }
 
-QString SampleValidator::validateMultiLayerItem(const MultiLayerItem* item)
+void SampleValidator::addMessage(const QString& m)
 {
-    QString result;
-
-    QVector<LayerItem*> layers = item->layers();
-
-    if (layers.isEmpty())
-        result = "MultiLayer should contain at least one layer.";
-    else if (layers.size() == 1) {
-        if (layers.front()->layouts().isEmpty())
-            result = "The single layer in your MultiLayer should contain ParticleLayout.";
-    }
-    return result;
-}
-
-QString SampleValidator::validateParticleLayoutItem(const ParticleLayoutItem* item)
-{
-    QString result;
-
-    QVector<ItemWithParticles*> particles = item->particles();
-    if (particles.isEmpty())
-        result = "ParticleLayout doesn't contain any particles.";
-
-    return result;
-}
-
-QString SampleValidator::validateParticleCoreShellItem(const ParticleCoreShellItem* item)
-{
-    QString result;
-
-    const ParticleItem* core = item->core();
-    const ParticleItem* shell = item->shell();
-
-    if (core == nullptr || shell == nullptr)
-        result = "ParticleCoreShell doesn't have either core or shell defined.";
-
-    return result;
-}
-
-QString SampleValidator::validateParticleCompositionItem(const ParticleCompositionItem* item)
-{
-    QString result;
-    if (item->particles().isEmpty())
-        result = "ParticleComposition doesn't have any particles.";
-
-    return result;
+    m_messages += QString("* ") + m + "\n";
 }
 
 bool SampleValidator::isValidMultiLayer(const MultiLayerItem* multilayer)
 {
-    initValidator();
+    m_messages.clear();
 
-    validateItem(multilayer);
-    iterateItems(multilayer);
+    QVector<LayerItem*> layers = multilayer->layers();
 
-    if (!m_valid_sample) {
-        m_validation_message =
-            "Can't setup DWBA simulation for given MultiLayer.\n" + m_validation_message;
-    }
-    return m_valid_sample;
+    if (layers.isEmpty())
+        addMessage("MultiLayer should contain at least one layer.");
+    if (layers.size() == 1)
+        if (layers.front()->layouts().isEmpty())
+            addMessage("The single layer in your MultiLayer should contain a particle layout.");
+
+    for (auto* layer : layers)
+        for (auto* layout : layer->layouts()) {
+            if (layout->particles().isEmpty())
+                addMessage("Particle layout doesn't contain any particles.");
+            for (auto* particle : layout->particles()) {
+                validateItem(particle);
+                iterateItems(particle);
+            }
+        }
+
+    if (!m_messages.isEmpty())
+        m_messages = "Can't setup DWBA simulation for given MultiLayer.\n" + m_messages;
+
+    return m_messages.isEmpty();
 }
diff --git a/GUI/Model/Sample/SampleValidator.h b/GUI/Model/Sample/SampleValidator.h
index 22e6491ddd9..00ef0ff63c7 100644
--- a/GUI/Model/Sample/SampleValidator.h
+++ b/GUI/Model/Sample/SampleValidator.h
@@ -26,25 +26,18 @@ class ParticleLayoutItem;
 //! Validates SampleModel for MultiLayerItem suitable for simulation
 class SampleValidator {
 public:
-    SampleValidator();
-
     bool isValidMultiLayer(const MultiLayerItem* multilayer);
 
-    QString getValidationMessage() const { return m_validation_message; }
+    QString getValidationMessage() const { return m_messages; }
 
 private:
-    void initValidator();
-
     void iterateItems(const SessionItem* parentItem);
     void validateItem(const SessionItem* item);
 
-    QString validateMultiLayerItem(const MultiLayerItem* item);
-    QString validateParticleLayoutItem(const ParticleLayoutItem* item);
-    QString validateParticleCoreShellItem(const ParticleCoreShellItem* item);
-    QString validateParticleCompositionItem(const ParticleCompositionItem* item);
+    //! Adds this message to the report.
+    void addMessage(const QString& m);
 
-    bool m_valid_sample;
-    QString m_validation_message;
+    QString m_messages;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_SAMPLE_SAMPLEVALIDATOR_H
-- 
GitLab