From a2520fa3bc27d9eb7b34464f6311fbcccdf6b1ae Mon Sep 17 00:00:00 2001
From: Walter Van Herck <w.van.herck@fz-juelich.de>
Date: Tue, 21 Apr 2015 14:12:11 +0200
Subject: [PATCH] Replaced shared_ptr with scoped_ptr in LayerSpecularInfo (2);
 provided clone methods to prevent shared pointers

---
 Core/Algorithms/inc/ILayerRTCoefficients.h    |  2 ++
 Core/Algorithms/inc/ISpecularInfoMap.h        |  2 ++
 Core/Algorithms/inc/MatrixRTCoefficients.h    |  2 ++
 Core/Algorithms/inc/MatrixSpecularInfoMap.h   |  2 ++
 Core/Algorithms/inc/ScalarRTCoefficients.h    |  7 +++++++
 Core/Algorithms/inc/ScalarSpecularInfoMap.h   |  2 ++
 Core/Algorithms/src/LayerSpecularInfo.cpp     |  4 ++--
 Core/Algorithms/src/MatrixRTCoefficients.cpp  |  5 +++++
 Core/Algorithms/src/MatrixSpecularInfoMap.cpp | 21 ++++++++++++-------
 Core/Algorithms/src/ScalarSpecularInfoMap.cpp |  5 +++++
 10 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/Core/Algorithms/inc/ILayerRTCoefficients.h b/Core/Algorithms/inc/ILayerRTCoefficients.h
index ada1ed30816..5fc0f509e89 100644
--- a/Core/Algorithms/inc/ILayerRTCoefficients.h
+++ b/Core/Algorithms/inc/ILayerRTCoefficients.h
@@ -29,6 +29,8 @@ class BA_CORE_API_ ILayerRTCoefficients
 public:
     virtual ~ILayerRTCoefficients() {}
 
+    virtual ILayerRTCoefficients* clone() const=0;
+
 #ifndef GCCXML_SKIP_THIS
     //! The following functions return the transmitted and reflected amplitudes
     //! for different incoming beam polarizations and eigenmodes
diff --git a/Core/Algorithms/inc/ISpecularInfoMap.h b/Core/Algorithms/inc/ISpecularInfoMap.h
index 1162c189f94..7cd35b835b4 100644
--- a/Core/Algorithms/inc/ISpecularInfoMap.h
+++ b/Core/Algorithms/inc/ISpecularInfoMap.h
@@ -29,6 +29,8 @@ public:
     ISpecularInfoMap() {}
     virtual ~ISpecularInfoMap() {}
 
+    virtual ISpecularInfoMap* clone() const=0;
+
     //! Retrieves the amplitude coefficients for the given angles
     virtual const ILayerRTCoefficients *getCoefficients(
             double alhpa_f, double phi_f) const=0;
diff --git a/Core/Algorithms/inc/MatrixRTCoefficients.h b/Core/Algorithms/inc/MatrixRTCoefficients.h
index 265d296e710..49ce72403ba 100644
--- a/Core/Algorithms/inc/MatrixRTCoefficients.h
+++ b/Core/Algorithms/inc/MatrixRTCoefficients.h
@@ -31,6 +31,8 @@ public:
     MatrixRTCoefficients() : m_kt(0.0) {}
     virtual ~MatrixRTCoefficients() {}
 
+    virtual MatrixRTCoefficients* clone() const;
+
     //! The following functions return the transmitted and reflected amplitudes
     //! for different incoming beam polarizations and eigenmodes
     virtual Eigen::Vector2cd T1plus() const;
diff --git a/Core/Algorithms/inc/MatrixSpecularInfoMap.h b/Core/Algorithms/inc/MatrixSpecularInfoMap.h
index fb9b9b3e8c0..d7ab923be1f 100644
--- a/Core/Algorithms/inc/MatrixSpecularInfoMap.h
+++ b/Core/Algorithms/inc/MatrixSpecularInfoMap.h
@@ -34,6 +34,8 @@ public:
                           double wavelength);
     virtual ~MatrixSpecularInfoMap() {}
 
+    virtual MatrixSpecularInfoMap* clone() const;
+
     //! Retrieves the amplitude coefficients for the given angles
     virtual const MatrixRTCoefficients *getCoefficients(
             double alpha_f, double phi_f) const;
diff --git a/Core/Algorithms/inc/ScalarRTCoefficients.h b/Core/Algorithms/inc/ScalarRTCoefficients.h
index 0ef1861e301..4c35c6cb47b 100644
--- a/Core/Algorithms/inc/ScalarRTCoefficients.h
+++ b/Core/Algorithms/inc/ScalarRTCoefficients.h
@@ -31,6 +31,8 @@ public:
     ScalarRTCoefficients();
     virtual ~ScalarRTCoefficients() {}
 
+    virtual ScalarRTCoefficients* clone() const;
+
     //! The following functions return the transmitted and reflected amplitudes
     //! for different incoming beam polarizations and eigenmodes
     virtual Eigen::Vector2cd T1plus() const;
@@ -72,6 +74,11 @@ inline ScalarRTCoefficients::ScalarRTCoefficients()
     t_r << complex_t(1.0, 0.0), complex_t(0.0, 0.0);
 }
 
+inline ScalarRTCoefficients *ScalarRTCoefficients::clone() const
+{
+    return new ScalarRTCoefficients(*this);
+}
+
 inline Eigen::Vector2cd ScalarRTCoefficients::T1plus() const
 {
     return Eigen::Vector2cd::Zero();
diff --git a/Core/Algorithms/inc/ScalarSpecularInfoMap.h b/Core/Algorithms/inc/ScalarSpecularInfoMap.h
index a33fb4c83ae..fdb79f39e1f 100644
--- a/Core/Algorithms/inc/ScalarSpecularInfoMap.h
+++ b/Core/Algorithms/inc/ScalarSpecularInfoMap.h
@@ -34,6 +34,8 @@ public:
                           double wavelength);
     virtual ~ScalarSpecularInfoMap() {}
 
+    virtual ScalarSpecularInfoMap* clone() const;
+
     //! Retrieves the amplitude coefficients for the given angles
     virtual const ScalarRTCoefficients *getCoefficients(
             double alpha_f, double phi_f) const;
diff --git a/Core/Algorithms/src/LayerSpecularInfo.cpp b/Core/Algorithms/src/LayerSpecularInfo.cpp
index da9a35328e1..e444ad25171 100644
--- a/Core/Algorithms/src/LayerSpecularInfo.cpp
+++ b/Core/Algorithms/src/LayerSpecularInfo.cpp
@@ -22,8 +22,8 @@ LayerSpecularInfo::LayerSpecularInfo()
 LayerSpecularInfo* LayerSpecularInfo::clone() const
 {
     LayerSpecularInfo *p_result = new LayerSpecularInfo;
-    p_result->mP_out_coeff_map = this->mP_out_coeff_map;
-    p_result->mP_in_coeffs = this->mP_in_coeffs;
+    p_result->mP_out_coeff_map.reset(this->mP_out_coeff_map->clone());
+    p_result->mP_in_coeffs.reset(this->mP_in_coeffs->clone());
     return p_result;
 }
 
diff --git a/Core/Algorithms/src/MatrixRTCoefficients.cpp b/Core/Algorithms/src/MatrixRTCoefficients.cpp
index 2aaa34eab6d..06e00725307 100644
--- a/Core/Algorithms/src/MatrixRTCoefficients.cpp
+++ b/Core/Algorithms/src/MatrixRTCoefficients.cpp
@@ -15,6 +15,11 @@
 
 #include "MatrixRTCoefficients.h"
 
+MatrixRTCoefficients *MatrixRTCoefficients::clone() const
+{
+    return new MatrixRTCoefficients(*this);
+}
+
 void MatrixRTCoefficients::calculateTRMatrices()
 {
     if (m_b_mag == 0.0) {
diff --git a/Core/Algorithms/src/MatrixSpecularInfoMap.cpp b/Core/Algorithms/src/MatrixSpecularInfoMap.cpp
index 3e33aab4b40..b3725e0390a 100644
--- a/Core/Algorithms/src/MatrixSpecularInfoMap.cpp
+++ b/Core/Algorithms/src/MatrixSpecularInfoMap.cpp
@@ -18,17 +18,24 @@
 
 #include <boost/scoped_ptr.hpp>
 
+MatrixSpecularInfoMap::MatrixSpecularInfoMap(const MultiLayer *multilayer, int layer,
+                                             double wavelength)
+    : m_layer(layer), m_wavelength(wavelength)
+{
+    if (multilayer)
+        mP_inverted_multilayer.reset(multilayer->cloneInvertB());
+}
 
-MatrixSpecularInfoMap::MatrixSpecularInfoMap(const MultiLayer *multilayer,
-                                             int layer, double wavelength)
-: m_layer(layer)
-, m_wavelength(wavelength)
+MatrixSpecularInfoMap *MatrixSpecularInfoMap::clone() const
 {
-    mP_inverted_multilayer.reset(multilayer->cloneInvertB());
+    MatrixSpecularInfoMap *result = new MatrixSpecularInfoMap(0, m_layer, m_wavelength);
+    if (mP_inverted_multilayer.get())
+        result->mP_inverted_multilayer.reset(mP_inverted_multilayer->clone());
+    return result;
 }
 
-const MatrixRTCoefficients *MatrixSpecularInfoMap::getCoefficients(
-        double alpha_f, double phi_f) const
+const MatrixRTCoefficients *MatrixSpecularInfoMap::getCoefficients(double alpha_f,
+                                                                   double phi_f) const
 {
     SpecularMagnetic specular_calculator;
     SpecularMagnetic::MultiLayerCoeff_t coeffs;
diff --git a/Core/Algorithms/src/ScalarSpecularInfoMap.cpp b/Core/Algorithms/src/ScalarSpecularInfoMap.cpp
index 927622d3267..d3cebc6c824 100644
--- a/Core/Algorithms/src/ScalarSpecularInfoMap.cpp
+++ b/Core/Algorithms/src/ScalarSpecularInfoMap.cpp
@@ -25,6 +25,11 @@ ScalarSpecularInfoMap::ScalarSpecularInfoMap(const MultiLayer *multilayer,
 {
 }
 
+ScalarSpecularInfoMap *ScalarSpecularInfoMap::clone() const
+{
+    return new ScalarSpecularInfoMap(mp_multilayer, m_layer, m_wavelength);
+}
+
 const ScalarRTCoefficients *ScalarSpecularInfoMap::getCoefficients(
         double alpha_f, double phi_f) const
 {
-- 
GitLab