From 59c07e98aacc70a0e949f2b8292aad56387249c9 Mon Sep 17 00:00:00 2001
From: Joachim Wuttke <j.wuttke@fz-juelich.de>
Date: Sat, 3 Sep 2022 08:43:37 +0200
Subject: [PATCH] ResolutionFunction2DGaussian using validate

---
 .../ResolutionFunction2DGaussian.cpp          | 17 +++++++++--
 .../Resolution/ResolutionFunction2DGaussian.h |  2 ++
 auto/Wrap/doxygenDevice.i                     |  3 ++
 auto/Wrap/libBornAgainDevice.py               |  8 ++++++
 auto/Wrap/libBornAgainDevice_wrap.cpp         | 28 +++++++++++++++++++
 5 files changed, 55 insertions(+), 3 deletions(-)

diff --git a/Device/Resolution/ResolutionFunction2DGaussian.cpp b/Device/Resolution/ResolutionFunction2DGaussian.cpp
index 043f389e319..b0c7108e557 100644
--- a/Device/Resolution/ResolutionFunction2DGaussian.cpp
+++ b/Device/Resolution/ResolutionFunction2DGaussian.cpp
@@ -14,18 +14,29 @@
 
 #include "Device/Resolution/ResolutionFunction2DGaussian.h"
 #include "Base/Math/Functions.h"
-#include "Fit/Param/RealLimits.h"
+#include "Base/Util/Assert.h"
 
 ResolutionFunction2DGaussian::ResolutionFunction2DGaussian(double sigma_x, double sigma_y)
     : m_sigma_x(sigma_x)
     , m_sigma_y(sigma_y)
 {
-    RealLimits::nonnegative().check("SigmaX", m_sigma_x);
-    RealLimits::nonnegative().check("SigmaY", m_sigma_y);
+    validateOrThrow();
 }
 
 double ResolutionFunction2DGaussian::evaluateCDF(double x, double y) const
 {
+    ASSERT(m_validated);
     return Math::IntegratedGaussian(x, 0.0, m_sigma_x)
            * Math::IntegratedGaussian(y, 0.0, m_sigma_y);
 }
+
+std::string ResolutionFunction2DGaussian::validate() const
+{
+    std::vector<std::string> errs;
+    requestGt0(errs, m_sigma_x, "sigma_x");
+    requestGt0(errs, m_sigma_y, "sigma_y");
+    if (!errs.empty())
+        return jointError(errs);
+    m_validated = true;
+    return "";
+}
diff --git a/Device/Resolution/ResolutionFunction2DGaussian.h b/Device/Resolution/ResolutionFunction2DGaussian.h
index b410f9cf982..92361afb1fc 100644
--- a/Device/Resolution/ResolutionFunction2DGaussian.h
+++ b/Device/Resolution/ResolutionFunction2DGaussian.h
@@ -39,6 +39,8 @@ public:
     double sigmaX() const { return m_sigma_x; }
     double sigmaY() const { return m_sigma_y; }
 
+    std::string validate() const override;
+
 private:
     ResolutionFunction2DGaussian& operator=(const ResolutionFunction2DGaussian&);
 
diff --git a/auto/Wrap/doxygenDevice.i b/auto/Wrap/doxygenDevice.i
index 5c9f973c261..fd6a5a40be9 100644
--- a/auto/Wrap/doxygenDevice.i
+++ b/auto/Wrap/doxygenDevice.i
@@ -1581,6 +1581,9 @@ ResolutionFunction2DGaussian::sigmaX";
 %feature("docstring")  ResolutionFunction2DGaussian::sigmaY "double ResolutionFunction2DGaussian::sigmaY() const
 ResolutionFunction2DGaussian::sigmaY";
 
+%feature("docstring")  ResolutionFunction2DGaussian::validate "std::string ResolutionFunction2DGaussian::validate() const override
+ResolutionFunction2DGaussian::validate";
+
 
 // File: structIDetector_1_1RoiOfAxis.xml
 
diff --git a/auto/Wrap/libBornAgainDevice.py b/auto/Wrap/libBornAgainDevice.py
index c582f62f711..10a84add508 100644
--- a/auto/Wrap/libBornAgainDevice.py
+++ b/auto/Wrap/libBornAgainDevice.py
@@ -3342,6 +3342,14 @@ class ResolutionFunction2DGaussian(IResolutionFunction2D):
         ResolutionFunction2DGaussian::sigmaY
         """
         return _libBornAgainDevice.ResolutionFunction2DGaussian_sigmaY(self)
+
+    def validate(self):
+        r"""
+        validate(ResolutionFunction2DGaussian self) -> std::string
+        std::string ResolutionFunction2DGaussian::validate() const override
+        ResolutionFunction2DGaussian::validate
+        """
+        return _libBornAgainDevice.ResolutionFunction2DGaussian_validate(self)
     __swig_destroy__ = _libBornAgainDevice.delete_ResolutionFunction2DGaussian
 
 # Register ResolutionFunction2DGaussian in _libBornAgainDevice:
diff --git a/auto/Wrap/libBornAgainDevice_wrap.cpp b/auto/Wrap/libBornAgainDevice_wrap.cpp
index ff4bb1884a2..6a9e054c4e4 100644
--- a/auto/Wrap/libBornAgainDevice_wrap.cpp
+++ b/auto/Wrap/libBornAgainDevice_wrap.cpp
@@ -32747,6 +32747,29 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_ResolutionFunction2DGaussian_validate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  ResolutionFunction2DGaussian *arg1 = (ResolutionFunction2DGaussian *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject *swig_obj[1] ;
+  std::string result;
+  
+  if (!args) SWIG_fail;
+  swig_obj[0] = args;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_ResolutionFunction2DGaussian, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "ResolutionFunction2DGaussian_validate" "', argument " "1"" of type '" "ResolutionFunction2DGaussian const *""'"); 
+  }
+  arg1 = reinterpret_cast< ResolutionFunction2DGaussian * >(argp1);
+  result = ((ResolutionFunction2DGaussian const *)arg1)->validate();
+  resultobj = SWIG_From_std_string(static_cast< std::string >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_delete_ResolutionFunction2DGaussian(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   ResolutionFunction2DGaussian *arg1 = (ResolutionFunction2DGaussian *) 0 ;
@@ -38917,6 +38940,11 @@ static PyMethodDef SwigMethods[] = {
 		"double ResolutionFunction2DGaussian::sigmaY() const\n"
 		"ResolutionFunction2DGaussian::sigmaY\n"
 		""},
+	 { "ResolutionFunction2DGaussian_validate", _wrap_ResolutionFunction2DGaussian_validate, METH_O, "\n"
+		"ResolutionFunction2DGaussian_validate(ResolutionFunction2DGaussian self) -> std::string\n"
+		"std::string ResolutionFunction2DGaussian::validate() const override\n"
+		"ResolutionFunction2DGaussian::validate\n"
+		""},
 	 { "delete_ResolutionFunction2DGaussian", _wrap_delete_ResolutionFunction2DGaussian, METH_O, "delete_ResolutionFunction2DGaussian(ResolutionFunction2DGaussian self)"},
 	 { "ResolutionFunction2DGaussian_swigregister", ResolutionFunction2DGaussian_swigregister, METH_O, NULL},
 	 { "ResolutionFunction2DGaussian_swiginit", ResolutionFunction2DGaussian_swiginit, METH_VARARGS, NULL},
-- 
GitLab