From cb190540466df6686fce172c469d5f64236cdb1f Mon Sep 17 00:00:00 2001
From: Randolf Beerwerth <r.beerwerth@fz-juelich.de>
Date: Fri, 21 Aug 2020 13:35:33 +0200
Subject: [PATCH] Revamp typedefs for RT coefficients and delete copy
 constructor for ISpecularStrategy

---
 Core/Computation/SpecularComputationTerm.cpp | 2 +-
 Core/Computation/SpecularComputationTerm.h   | 2 +-
 Core/Multilayer/ISpecularStrategy.h          | 9 +++++++--
 Core/Multilayer/MatrixFresnelMap.cpp         | 4 ++--
 Core/Multilayer/ScalarFresnelMap.cpp         | 4 ++--
 Core/Multilayer/SpecularMagneticStrategy.h   | 5 +++++
 Core/Multilayer/SpecularScalarStrategy.h     | 4 ++++
 7 files changed, 22 insertions(+), 8 deletions(-)

diff --git a/Core/Computation/SpecularComputationTerm.cpp b/Core/Computation/SpecularComputationTerm.cpp
index a00596df5d1..2c5a6ed658c 100644
--- a/Core/Computation/SpecularComputationTerm.cpp
+++ b/Core/Computation/SpecularComputationTerm.cpp
@@ -69,7 +69,7 @@ void SpecularMatrixTerm::eval(SpecularSimulationElement& elem,
 }
 
 double SpecularMatrixTerm::intensity(const SpecularSimulationElement& elem,
-                                     ISpecularStrategy::single_coeff_t& coeff) const
+                                     const ISpecularStrategy::coefficient_pointer_type& coeff) const
 {
     const auto& polarization = elem.polarizationHandler().getPolarization();
     const auto& analyzer = elem.polarizationHandler().getAnalyzerOperator();
diff --git a/Core/Computation/SpecularComputationTerm.h b/Core/Computation/SpecularComputationTerm.h
index faefd62e774..d86ca1edfac 100644
--- a/Core/Computation/SpecularComputationTerm.h
+++ b/Core/Computation/SpecularComputationTerm.h
@@ -85,7 +85,7 @@ private:
 protected:
     void eval(SpecularSimulationElement& elem, const std::vector<Slice>& slices) const override;
     double intensity(const SpecularSimulationElement& elem,
-                     ISpecularStrategy::single_coeff_t& coeff) const;
+                     const ISpecularStrategy::coefficient_pointer_type& coeff) const;
 };
 
 #endif // BORNAGAIN_CORE_COMPUTATION_SPECULARCOMPUTATIONTERM_H
diff --git a/Core/Multilayer/ISpecularStrategy.h b/Core/Multilayer/ISpecularStrategy.h
index c7300fb50fc..0fc7764b820 100644
--- a/Core/Multilayer/ISpecularStrategy.h
+++ b/Core/Multilayer/ISpecularStrategy.h
@@ -29,8 +29,13 @@ class BA_CORE_API_ ISpecularStrategy
 {
 public:
     virtual ~ISpecularStrategy() = default;
-    using single_coeff_t = std::unique_ptr<const ILayerRTCoefficients>;
-    using coeffs_t = std::vector<single_coeff_t>;
+    ISpecularStrategy() = default;
+    ISpecularStrategy& operator=(const ISpecularStrategy& other) = delete;
+    ISpecularStrategy(const ISpecularStrategy& other) = delete;
+
+    using coefficient_type         = ILayerRTCoefficients;
+    using coefficient_pointer_type = std::unique_ptr<const coefficient_type>;
+    using coeffs_t = std::vector<coefficient_pointer_type>;
 
     virtual coeffs_t Execute(const std::vector<Slice>& slices, const kvector_t& k) const = 0;
 
diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp
index 3786a23740a..cc6bee7b4b2 100644
--- a/Core/Multilayer/MatrixFresnelMap.cpp
+++ b/Core/Multilayer/MatrixFresnelMap.cpp
@@ -61,10 +61,10 @@ MatrixFresnelMap::getCoefficients(const kvector_t& kvec, size_t layer_index,
 {
     if (!m_use_cache) {
         auto coeffs = m_Strategy->Execute(slices, kvec);
-        return ISpecularStrategy::single_coeff_t(coeffs[layer_index]->clone());
+        return ISpecularStrategy::coefficient_pointer_type(coeffs[layer_index]->clone());
     }
     const auto& coef_vector = getCoefficientsFromCache(kvec, slices, hash_table);
-    return ISpecularStrategy::single_coeff_t(coef_vector[layer_index]->clone());
+    return ISpecularStrategy::coefficient_pointer_type(coef_vector[layer_index]->clone());
 }
 
 const ISpecularStrategy::coeffs_t&
diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp
index 8626644eb51..1beb426972d 100644
--- a/Core/Multilayer/ScalarFresnelMap.cpp
+++ b/Core/Multilayer/ScalarFresnelMap.cpp
@@ -44,10 +44,10 @@ ScalarFresnelMap::getCoefficients(const kvector_t& kvec, size_t layer_index) con
 {
     if (!m_use_cache) {
         auto coeffs = m_Strategy->Execute(m_slices, kvec);
-        return ISpecularStrategy::single_coeff_t(coeffs[layer_index]->clone());
+        return ISpecularStrategy::coefficient_pointer_type(coeffs[layer_index]->clone());
     }
     const auto& coef_vector = getCoefficientsFromCache(kvec);
-    return ISpecularStrategy::single_coeff_t(coef_vector[layer_index]->clone());
+    return ISpecularStrategy::coefficient_pointer_type(coef_vector[layer_index]->clone());
 }
 
 const ISpecularStrategy::coeffs_t& ScalarFresnelMap::getCoefficientsFromCache(kvector_t kvec) const
diff --git a/Core/Multilayer/SpecularMagneticStrategy.h b/Core/Multilayer/SpecularMagneticStrategy.h
index 3903b05119b..2ae617a4fe0 100644
--- a/Core/Multilayer/SpecularMagneticStrategy.h
+++ b/Core/Multilayer/SpecularMagneticStrategy.h
@@ -33,6 +33,10 @@ class Slice;
 class BA_CORE_API_ SpecularMagneticStrategy : public ISpecularStrategy
 {
 public:
+    using coefficient_type         = MatrixRTCoefficients_v2;
+    using coefficient_pointer_type = std::unique_ptr<const coefficient_type>;
+    using coeffs_t                 = std::vector<coefficient_pointer_type>;
+
     //! Computes refraction angle reflection/transmission coefficients
     //! for given sliced multilayer and wavevector k
     ISpecularStrategy::coeffs_t Execute(const std::vector<Slice>& slices, const kvector_t& k) const;
@@ -42,6 +46,7 @@ public:
     ISpecularStrategy::coeffs_t Execute(const std::vector<Slice>& slices,
                                         const std::vector<complex_t>& kz) const;
 
+private:
     static std::vector<MatrixRTCoefficients_v2> computeTR(const std::vector<Slice>& slices,
                                                           const std::vector<complex_t>& kzs);
 
diff --git a/Core/Multilayer/SpecularScalarStrategy.h b/Core/Multilayer/SpecularScalarStrategy.h
index 02f2d7d66c7..aaa117d03d3 100644
--- a/Core/Multilayer/SpecularScalarStrategy.h
+++ b/Core/Multilayer/SpecularScalarStrategy.h
@@ -34,6 +34,10 @@ class Slice;
 class BA_CORE_API_ SpecularScalarStrategy : public ISpecularStrategy
 {
 public:
+    using coefficient_type         = ScalarRTCoefficients;
+    using coefficient_pointer_type = std::unique_ptr<const coefficient_type>;
+    using coeffs_t = std::vector<coefficient_pointer_type>;
+
     //! Computes refraction angles and transmission/reflection coefficients
     //! for given coherent wave propagation in a multilayer.
     virtual ISpecularStrategy::coeffs_t Execute(const std::vector<Slice>& slices,
-- 
GitLab