From 830a901a3c300a43fabde11b664a8dcb260d5335 Mon Sep 17 00:00:00 2001
From: Dmitry Yurov <d.yurov@fz-juelich.de>
Date: Mon, 26 Mar 2018 13:24:38 +0200
Subject: [PATCH] Changes to IFresnelMap for easier access to Fresnel
 coefficients

---
 Core/Multilayer/IFresnelMap.h        | 13 +++++++++++--
 Core/Multilayer/MatrixFresnelMap.cpp | 19 ++++++++++---------
 Core/Multilayer/MatrixFresnelMap.h   |  7 +++----
 Core/Multilayer/ScalarFresnelMap.cpp | 11 +++--------
 Core/Multilayer/ScalarFresnelMap.h   |  8 ++------
 5 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/Core/Multilayer/IFresnelMap.h b/Core/Multilayer/IFresnelMap.h
index 95c932276b0..8ee7452a905 100644
--- a/Core/Multilayer/IFresnelMap.h
+++ b/Core/Multilayer/IFresnelMap.h
@@ -19,11 +19,14 @@
 #include <cstddef>
 #include <memory>
 
+template<class T> class BasicVector3D;
 class ILayerRTCoefficients;
 class MultiLayer;
 class SimulationElement;
 class SpecularSimulationElement;
 
+typedef BasicVector3D<double> kvector_t;
+
 //! Holds the necessary information to calculate the radiation wavefunction in every layer
 //! for different incoming (outgoing) angles of the beam in the top layer
 //! (these amplitudes correspond to the specular part of the wavefunction).
@@ -40,8 +43,11 @@ public:
             const SimulationElement& sim_element, size_t layer_index) const =0;
 
     //! Retrieves the amplitude coefficients for an incoming wavevector.
-    virtual const ILayerRTCoefficients* getInCoefficients(
-            const SimulationElement& sim_element, size_t layer_index) const =0;
+    template <typename T>
+    const ILayerRTCoefficients* getInCoefficients(const T& sim_element, size_t layer_index) const
+    {
+        return getCoefficients(sim_element.getKi(), layer_index);
+    }
 
     //! Fills simulation element specular data
     virtual void fillSpecularData(SpecularSimulationElement& sim_element) const = 0;
@@ -53,6 +59,9 @@ public:
     void disableCaching();
 
 protected:
+    virtual const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec,
+                                                        size_t layer_index) const = 0;
+
     bool m_use_cache;
     std::unique_ptr<MultiLayer> mP_multilayer;
 };
diff --git a/Core/Multilayer/MatrixFresnelMap.cpp b/Core/Multilayer/MatrixFresnelMap.cpp
index 3faebf0bdbb..2ce25b00684 100644
--- a/Core/Multilayer/MatrixFresnelMap.cpp
+++ b/Core/Multilayer/MatrixFresnelMap.cpp
@@ -41,12 +41,6 @@ MatrixFresnelMap::getOutCoefficients(const SimulationElement& sim_element, size_
                            m_hash_table_out);
 }
 
-const ILayerRTCoefficients*
-MatrixFresnelMap::getInCoefficients(const SimulationElement& sim_element, size_t layer_index) const
-{
-    return getCoefficients(sim_element.getKi(), layer_index, *mP_multilayer, m_hash_table_in);
-}
-
 void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const
 {
     const auto& kvec = sim_element.getKi();
@@ -57,9 +51,16 @@ void MatrixFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element)
         sim_element.setSpecular(SpecularData(calculateCoefficients(*mP_multilayer, kvec)));
 }
 
-const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(kvector_t kvec, size_t layer_index,
-                                                const MultiLayer& multilayer,
-                                                CoefficientHash& hash_table) const
+const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(const kvector_t& kvec,
+                                                              size_t layer_index) const
+{
+    return getCoefficients(kvec, layer_index, *mP_multilayer, m_hash_table_in);
+}
+
+const ILayerRTCoefficients* MatrixFresnelMap::getCoefficients(const kvector_t& kvec,
+                                                              size_t layer_index,
+                                                              const MultiLayer& multilayer,
+                                                              CoefficientHash& hash_table) const
 {
     if (!m_use_cache) {
         auto coeffs = calculateCoefficients(multilayer, kvec);
diff --git a/Core/Multilayer/MatrixFresnelMap.h b/Core/Multilayer/MatrixFresnelMap.h
index b02c461588c..1ff262fd169 100644
--- a/Core/Multilayer/MatrixFresnelMap.h
+++ b/Core/Multilayer/MatrixFresnelMap.h
@@ -38,9 +38,6 @@ public:
     const ILayerRTCoefficients* getOutCoefficients(const SimulationElement& sim_element,
                                                    size_t layer_index) const final override;
 
-    const ILayerRTCoefficients* getInCoefficients(const SimulationElement& sim_element,
-                                                  size_t layer_index) const final override;
-
     void setMultilayer(const MultiLayer& multilayer) final override;
 
     //! Fills simulation element specular data
@@ -50,7 +47,9 @@ public:
         CoefficientHash;
 
 private:
-    const ILayerRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index,
+    const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec,
+                                                size_t layer_index) const override;
+    const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec, size_t layer_index,
                                                 const MultiLayer& multilayer,
                                                 CoefficientHash& hash_table) const;
 
diff --git a/Core/Multilayer/ScalarFresnelMap.cpp b/Core/Multilayer/ScalarFresnelMap.cpp
index fbc9c052a01..317d6d9a5f7 100644
--- a/Core/Multilayer/ScalarFresnelMap.cpp
+++ b/Core/Multilayer/ScalarFresnelMap.cpp
@@ -18,6 +18,7 @@
 #include "SimulationElement.h"
 #include "SpecularMatrix.h"
 #include "SpecularSimulationElement.h"
+#include "Vectors3D.h"
 
 namespace {
 std::vector<ScalarRTCoefficients> calculateCoefficients(const MultiLayer& multilayer,
@@ -36,12 +37,6 @@ const ILayerRTCoefficients* ScalarFresnelMap::getOutCoefficients(
     return getCoefficients(-sim_element.getMeanKf(), layer_index);
 }
 
-const ILayerRTCoefficients* ScalarFresnelMap::getInCoefficients(
-        const SimulationElement& sim_element, size_t layer_index) const
-{
-    return getCoefficients(sim_element.getKi(), layer_index);
-}
-
 void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element) const
 {
     const auto& kvec = sim_element.getKi();
@@ -51,8 +46,8 @@ void ScalarFresnelMap::fillSpecularData(SpecularSimulationElement& sim_element)
         sim_element.setSpecular(SpecularData(calculateCoefficients(*mP_multilayer, kvec)));
 }
 
-const ScalarRTCoefficients* ScalarFresnelMap::getCoefficients(
-        kvector_t kvec, size_t layer_index) const
+const ILayerRTCoefficients* ScalarFresnelMap::getCoefficients(const kvector_t& kvec,
+                                                              size_t layer_index) const
 {
     if (!m_use_cache) {
         auto coeffs = calculateCoefficients(*mP_multilayer, kvec);
diff --git a/Core/Multilayer/ScalarFresnelMap.h b/Core/Multilayer/ScalarFresnelMap.h
index 7ebd52cc264..ab00c12d96c 100644
--- a/Core/Multilayer/ScalarFresnelMap.h
+++ b/Core/Multilayer/ScalarFresnelMap.h
@@ -17,8 +17,6 @@
 
 #include "Hash2Doubles.h"
 #include "IFresnelMap.h"
-#include "Vectors3D.h"
-#include <memory>
 #include <unordered_map>
 #include <utility>
 #include <vector>
@@ -40,14 +38,12 @@ public:
     const ILayerRTCoefficients* getOutCoefficients (const SimulationElement& sim_element,
                                                     size_t layer_index) const final override;
 
-    const ILayerRTCoefficients* getInCoefficients(const SimulationElement& sim_element,
-                                                  size_t layer_index) const final override;
-
     //! Fills simulation element specular data
     void fillSpecularData(SpecularSimulationElement& sim_element) const override;
 
 private:
-    const ScalarRTCoefficients* getCoefficients(kvector_t kvec, size_t layer_index) const;
+    const ILayerRTCoefficients* getCoefficients(const kvector_t& kvec,
+                                                size_t layer_index) const override;
     const std::vector<ScalarRTCoefficients>& getCoefficientsFromCache(kvector_t kvec) const;
 
     mutable std::unordered_map<std::pair<double, double>, std::vector<ScalarRTCoefficients>,
-- 
GitLab