From f9b9dd8d45895517114ca5c74a33d89964bc6dd8 Mon Sep 17 00:00:00 2001
From: Mikhail Svechnikov <m.svechnikov@fz-juelich.de>
Date: Tue, 8 Nov 2022 12:06:44 +0100
Subject: [PATCH] FitParameterContainerItem and FitParameterItem: add
 OwningVector

---
 Base/Types/OwningVector.h                   |  2 +-
 GUI/Model/Job/FitParameterContainerItem.cpp |  8 +++-----
 GUI/Model/Job/FitParameterContainerItem.h   |  5 +++--
 GUI/Model/Job/FitParameterItem.cpp          | 14 +++++---------
 GUI/Model/Job/FitParameterItem.h            |  3 ++-
 GUI/Support/XML/UtilXML.h                   | 17 +++++++++--------
 6 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/Base/Types/OwningVector.h b/Base/Types/OwningVector.h
index 497d3d17c59..2191b83a532 100644
--- a/Base/Types/OwningVector.h
+++ b/Base/Types/OwningVector.h
@@ -67,7 +67,7 @@ public:
             return;
         for(size_t i=0; i<m_v.size(); i++)
             if(m_v[i] == e) {
-                delete m_v(i);
+                delete m_v[i];
                 m_v.erase(m_v.begin()+i);
                 return;
             }
diff --git a/GUI/Model/Job/FitParameterContainerItem.cpp b/GUI/Model/Job/FitParameterContainerItem.cpp
index 25c31629513..401a829d12a 100644
--- a/GUI/Model/Job/FitParameterContainerItem.cpp
+++ b/GUI/Model/Job/FitParameterContainerItem.cpp
@@ -68,9 +68,7 @@ void FitParameterContainerItem::createFitParameter(ParameterItem* parameterItem)
 
 void FitParameterContainerItem::removeFitParameter(FitParameterItem* fitPar)
 {
-    m_fitParameterItems.delete_at();
-        m_fitParameterItems.removeOne(fitPar);
-
+    m_fitParameterItems.delete_element(fitPar);
     updateFitParameterNames();
 }
 
@@ -120,7 +118,7 @@ FitParameterContainerItem::fitParameterItem(const ParameterItem* parameterItem)
 
 QVector<FitParameterItem*> FitParameterContainerItem::fitParameterItems() const
 {
-    return m_fitParameterItems;
+    return QVector<FitParameterItem*>(m_fitParameterItems.begin(), m_fitParameterItems.end());
 }
 
 QStringList FitParameterContainerItem::fitParameterNames() const
@@ -141,7 +139,7 @@ void FitParameterContainerItem::removeLink(const ParameterItem* parameterItem)
 FitParameterItem* FitParameterContainerItem::createBareFitParameter()
 {
     FitParameterItem* fitPar = new FitParameterItem(this);
-    m_fitParameterItems.append(fitPar);
+    m_fitParameterItems.emplace_back(fitPar);
     updateFitParameterNames();
     return fitPar;
 }
diff --git a/GUI/Model/Job/FitParameterContainerItem.h b/GUI/Model/Job/FitParameterContainerItem.h
index e714bf6c01f..ad6a3fd375e 100644
--- a/GUI/Model/Job/FitParameterContainerItem.h
+++ b/GUI/Model/Job/FitParameterContainerItem.h
@@ -15,6 +15,8 @@
 #ifndef BORNAGAIN_GUI_MODEL_JOB_FITPARAMETERCONTAINERITEM_H
 #define BORNAGAIN_GUI_MODEL_JOB_FITPARAMETERCONTAINERITEM_H
 
+#include "Base/Types/OwningVector.h"
+#include "GUI/Model/Job/FitParameterItem.h"
 #include <QObject>
 
 namespace mumufit {
@@ -22,7 +24,6 @@ namespace mumufit {
 class Parameters;
 }
 
-class FitParameterItem;
 class ParameterItem;
 class QXmlStreamReader;
 class QXmlStreamWriter;
@@ -77,7 +78,7 @@ signals:
     void fitItemChanged();
 
 private:
-    QVector<FitParameterItem*> m_fitParameterItems;
+    OwningVector<FitParameterItem> m_fitParameterItems;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_JOB_FITPARAMETERCONTAINERITEM_H
diff --git a/GUI/Model/Job/FitParameterItem.cpp b/GUI/Model/Job/FitParameterItem.cpp
index 12afcbdca46..da7db0b7c08 100644
--- a/GUI/Model/Job/FitParameterItem.cpp
+++ b/GUI/Model/Job/FitParameterItem.cpp
@@ -356,7 +356,7 @@ QObject* FitParameterItem::maximumItem() const
 void FitParameterItem::addLink(const QString& title, const QString& link)
 {
     FitParameterLinkItem* newLink = new FitParameterLinkItem(this);
-    m_links.append(newLink);
+    m_links.emplace_back(newLink);
 
     newLink->setTitle(title);
     newLink->setLink(link);
@@ -364,18 +364,14 @@ void FitParameterItem::addLink(const QString& title, const QString& link)
 
 void FitParameterItem::removeLink(const QString& link)
 {
-    for (FitParameterLinkItem* linkItem : linkItems())
-        if (linkItem->link() == link) {
-            if (linkItem)
-                delete linkItem;
-            if (m_links.contains(linkItem))
-                m_links.removeOne(linkItem);
-        }
+    for (FitParameterLinkItem* linkItem : m_links)
+        if (linkItem->link() == link)
+            m_links.delete_element(linkItem);
 }
 
 QVector<FitParameterLinkItem*> FitParameterItem::linkItems() const
 {
-    return m_links;
+    return QVector<FitParameterLinkItem*>(m_links.begin(), m_links.end());
 }
 
 QStringList FitParameterItem::links() const
diff --git a/GUI/Model/Job/FitParameterItem.h b/GUI/Model/Job/FitParameterItem.h
index f71ed0338f5..4ec654255ba 100644
--- a/GUI/Model/Job/FitParameterItem.h
+++ b/GUI/Model/Job/FitParameterItem.h
@@ -15,6 +15,7 @@
 #ifndef BORNAGAIN_GUI_MODEL_JOB_FITPARAMETERITEM_H
 #define BORNAGAIN_GUI_MODEL_JOB_FITPARAMETERITEM_H
 
+#include "Base/Types/OwningVector.h"
 #include "Fit/Param/AttLimits.h"
 #include "GUI/Util/ComboProperty.h"
 
@@ -128,7 +129,7 @@ private:
     std::unique_ptr<FitDoubleItem> m_startValueItem;
     std::unique_ptr<FitEditableDoubleItem> m_minItem;
     std::unique_ptr<FitEditableDoubleItem> m_maxItem;
-    QVector<FitParameterLinkItem*> m_links;
+    OwningVector<FitParameterLinkItem> m_links;
 };
 
 #endif // BORNAGAIN_GUI_MODEL_JOB_FITPARAMETERITEM_H
diff --git a/GUI/Support/XML/UtilXML.h b/GUI/Support/XML/UtilXML.h
index f7ae9e45d2f..a11a6857385 100644
--- a/GUI/Support/XML/UtilXML.h
+++ b/GUI/Support/XML/UtilXML.h
@@ -19,6 +19,7 @@
 #include <QXmlStreamWriter> // used in every including file
 #include <heinz/Complex.h>
 #include <heinz/Vectors3D.h>
+#include "Base/Types/OwningVector.h"
 
 class QXmlStreamReader;
 class MessageService;
@@ -105,27 +106,27 @@ void readVector(QXmlStreamReader* reader, const QString& tag, QVector<T>& vec)
     }
 }
 
-//! Write vector of classes recursively
+//! Write OwningVector of classes
 template <typename T>
-void writeVectorClass(QXmlStreamWriter* writer, const QString& tag, const QVector<T*>& vec)
+void writeVectorClass(QXmlStreamWriter* writer, const QString& tag, const OwningVector<T>& vec)
 {
-    for (int i = 0; i < vec.size(); i++) {
+    for (T* e : vec) {
         writer->writeStartElement(tag);
-        vec[i]->writeTo(writer);
+        e->writeTo(writer);
         writer->writeEndElement();
     }
 }
 
-//! Read vector of classes recursively
+//! Read OwningVector of classes
 template <typename T, typename... Args>
-void readVectorClass(QXmlStreamReader* reader, const QString& tag, QVector<T*>& vec,
+void readVectorClass(QXmlStreamReader* reader, const QString& tag, OwningVector<T>& vec,
                      Args... argsForConstructor)
 {
     vec.clear();
     while (reader->readNextStartElement()) {
         if (reader->name() == tag) {
-            vec.push_back(new T(argsForConstructor...));
-            vec.last()->readFrom(reader);
+            vec.emplace_back(new T(argsForConstructor...));
+            vec.back()->readFrom(reader);
             GUI::Session::XML::gotoEndElementOfTag(reader, tag);
         } else {
             reader->skipCurrentElement();
-- 
GitLab