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