From 24c635595d81ff41023027d77babc82af1ce1d67 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Wed, 18 May 2022 18:02:03 +0200
Subject: [PATCH] DetectorMask: pointerize Powerfield<bool> member

---
 Device/Detector/IDetector2D.cpp        |  2 ++
 Device/Mask/DetectorMask.cpp           | 44 +++++++++++++++-----------
 Device/Mask/DetectorMask.h             |  7 ++--
 Tests/Unit/Device/DetectorMaskTest.cpp |  1 +
 4 files changed, 32 insertions(+), 22 deletions(-)

diff --git a/Device/Detector/IDetector2D.cpp b/Device/Detector/IDetector2D.cpp
index 35b074e3a21..b307ceecf69 100644
--- a/Device/Detector/IDetector2D.cpp
+++ b/Device/Detector/IDetector2D.cpp
@@ -14,11 +14,13 @@
 
 #include "Device/Detector/IDetector2D.h"
 #include "Base/Const/Units.h"
+#include "Base/Axis/IAxis.h"
 #include "Device/Beam/Beam.h"
 #include "Device/Detector/DetectorContext.h"
 #include "Device/Mask/DetectorMask.h"
 #include "Device/Mask/InfinitePlane.h"
 #include "Resample/Element/DiffuseElement.h"
+#include "Base/Util/Assert.h"
 
 namespace {
 
diff --git a/Device/Mask/DetectorMask.cpp b/Device/Mask/DetectorMask.cpp
index 4dd25500440..17fba6427aa 100644
--- a/Device/Mask/DetectorMask.cpp
+++ b/Device/Mask/DetectorMask.cpp
@@ -17,6 +17,7 @@
 #include "Device/Histo/Histogram2D.h"
 #include "Device/Mask/IShape2D.h"
 #include "Base/Types/ICloneable.h"
+#include "Device/Data/Powerfield.h"
 
 class MaskPattern : public ICloneable {
 public:
@@ -29,16 +30,20 @@ public:
 
 
 DetectorMask::DetectorMask()
-    : m_number_of_masked_channels(0)
+    : m_masked(new Powerfield<bool>)
+    , m_number_of_masked_channels(0)
 {
 }
 
 DetectorMask::DetectorMask(const IAxis& xAxis, const IAxis& yAxis)
+    : DetectorMask()
 {
-    m_masked.clear();
+    m_masked->clear();
 
-    m_masked.addAxis(xAxis);
-    m_masked.addAxis(yAxis);
+    m_masked->addAxis(xAxis);
+    m_masked->addAxis(yAxis);
+
+//    m_masked.reset(new Powerfield<bool>(xAxis, yAxis));
 
     process_masks();
 }
@@ -47,16 +52,17 @@ DetectorMask::~DetectorMask() = default;
 
 DetectorMask::DetectorMask(const DetectorMask& other)
     : m_stack(other.m_stack)
+    , m_masked(other.m_masked->clone())
     , m_number_of_masked_channels(other.m_number_of_masked_channels)
 {
-    m_masked.copyFrom(other.m_masked);
+    m_masked->copyFrom(*other.m_masked);
 }
 
 DetectorMask& DetectorMask::operator=(const DetectorMask& other)
 {
     if (this != &other) {
         m_stack = other.m_stack;
-        m_masked.copyFrom(other.m_masked);
+        m_masked.reset(other.m_masked->clone());
         m_number_of_masked_channels = other.m_number_of_masked_channels;
     }
     return *this;
@@ -65,31 +71,31 @@ DetectorMask& DetectorMask::operator=(const DetectorMask& other)
 void DetectorMask::addMask(const IShape2D& shape, bool mask_value)
 {
     m_stack.emplace_back(new MaskPattern(shape.clone(), mask_value));
-    m_masked.clear();
+    m_masked->clear();
     m_number_of_masked_channels = 0;
 }
 
 void DetectorMask::initMaskData(const IAxis& xAxis, const IAxis& yAxis)
 {
-    m_masked.clear();
+    m_masked->clear();
 
-    m_masked.addAxis(xAxis);
-    m_masked.addAxis(yAxis);
+    m_masked->addAxis(xAxis);
+    m_masked->addAxis(yAxis);
 
     process_masks();
 }
 
 bool DetectorMask::isMasked(size_t index) const
 {
-    return m_number_of_masked_channels == 0 ? false : m_masked[index];
+    return m_number_of_masked_channels == 0 ? false : (*m_masked)[index];
 }
 
 Histogram2D* DetectorMask::createHistogram() const
 {
     Powerfield<double> data;
-    data.copyShapeFrom(m_masked);
-    for (size_t i = 0; i < m_masked.getAllocatedSize(); ++i)
-        data[i] = static_cast<double>(m_masked[i]);
+    data.copyShapeFrom(*m_masked);
+    for (size_t i = 0; i < m_masked->getAllocatedSize(); ++i)
+        data[i] = static_cast<double>((*m_masked)[i]);
     return dynamic_cast<Histogram2D*>(IHistogram::createHistogram(data));
 }
 
@@ -113,14 +119,14 @@ const IShape2D* DetectorMask::getMaskShape(size_t mask_index, bool& mask_value)
 
 void DetectorMask::process_masks()
 {
-    m_masked.setAllTo(false);
+    m_masked->setAllTo(false);
     if (!!m_stack.empty())
         return;
 
     m_number_of_masked_channels = 0;
-    for (size_t index = 0; index < m_masked.getAllocatedSize(); ++index) {
-        Bin1D binx = m_masked.getAxisBin(index, 0);
-        Bin1D biny = m_masked.getAxisBin(index, 1);
+    for (size_t index = 0; index < m_masked->getAllocatedSize(); ++index) {
+        Bin1D binx = m_masked->getAxisBin(index, 0);
+        Bin1D biny = m_masked->getAxisBin(index, 1);
         // setting mask to the data starting from last shape added
         bool is_masked(false);
         for (size_t k = m_stack.size(); k > 0; --k) {
@@ -128,7 +134,7 @@ void DetectorMask::process_masks()
             if (pat->shape->contains(binx, biny)) {
                 if (pat->doMask)
                     is_masked = true;
-                m_masked[index] = pat->doMask;
+                (*m_masked)[index] = pat->doMask;
                 break; // index is covered by the shape, stop looking further
             }
         }
diff --git a/Device/Mask/DetectorMask.h b/Device/Mask/DetectorMask.h
index a0b18221318..014cabc64dc 100644
--- a/Device/Mask/DetectorMask.h
+++ b/Device/Mask/DetectorMask.h
@@ -15,7 +15,8 @@
 #ifndef BORNAGAIN_DEVICE_MASK_DETECTORMASK_H
 #define BORNAGAIN_DEVICE_MASK_DETECTORMASK_H
 
-#include "Device/Data/Powerfield.h"
+#include <memory>
+
 #ifndef SWIG
 #include "Base/Types/OwningVector.h"
 #endif
@@ -50,7 +51,7 @@ public:
 
     bool isMasked(size_t index) const;
 
-    const Powerfield<bool>* getMaskData() const { return &m_masked; }
+    const Powerfield<bool>* getMaskData() const { return m_masked.get(); }
 
     Histogram2D* createHistogram() const;
 
@@ -72,7 +73,7 @@ private:
 #endif
 
     // cached secondary data:
-    Powerfield<bool> m_masked;
+    std::unique_ptr<Powerfield<bool>> m_masked;
     int m_number_of_masked_channels;
 };
 
diff --git a/Tests/Unit/Device/DetectorMaskTest.cpp b/Tests/Unit/Device/DetectorMaskTest.cpp
index 25c7b4bf4b1..540de4a0724 100644
--- a/Tests/Unit/Device/DetectorMaskTest.cpp
+++ b/Tests/Unit/Device/DetectorMaskTest.cpp
@@ -2,6 +2,7 @@
 #include "Device/Detector/SphericalDetector.h"
 #include "Device/Mask/Polygon.h"
 #include "Tests/GTestWrapper/google_test.h"
+#include "Device/Data/Powerfield.h"
 #include <memory>
 
 class DetectorMaskTest : public ::testing::Test {
-- 
GitLab