From 5ac2b4690adee25eb568d96792b516b78f440c11 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de>
Date: Tue, 24 Aug 2021 15:25:57 +0200
Subject: [PATCH] + RealLimits::check

---
 Fit/Param/RealLimits.cpp           | 10 ++++++
 Fit/Param/RealLimits.h             |  2 ++
 auto/Wrap/doxygenFit.i             |  3 ++
 auto/Wrap/libBornAgainFit.py       |  8 +++++
 auto/Wrap/libBornAgainFit_wrap.cpp | 49 ++++++++++++++++++++++++++++++
 5 files changed, 72 insertions(+)

diff --git a/Fit/Param/RealLimits.cpp b/Fit/Param/RealLimits.cpp
index 99010ee3880..8fb19309119 100644
--- a/Fit/Param/RealLimits.cpp
+++ b/Fit/Param/RealLimits.cpp
@@ -158,6 +158,16 @@ std::string RealLimits::toString() const
     return result.str();
 }
 
+void RealLimits::check(const std::string& name, const double value)
+{
+    if (!isInRange(value)) {
+        std::ostringstream message;
+        message << "Parameter " << name << ": value " << value
+                << " is out of bounds [" << *this << "]\n";
+        throw std::runtime_error(message.str());
+    }
+}
+
 bool RealLimits::operator==(const RealLimits& other) const
 {
     return (m_has_lower_limit == other.m_has_lower_limit)
diff --git a/Fit/Param/RealLimits.h b/Fit/Param/RealLimits.h
index 3734f14903e..a30ae9aeee1 100644
--- a/Fit/Param/RealLimits.h
+++ b/Fit/Param/RealLimits.h
@@ -81,6 +81,8 @@ public:
 
     std::string toString() const;
 
+    void check(const std::string& name, const double value);
+
     //! Prints class
     friend std::ostream& operator<<(std::ostream& ostr, const RealLimits& m)
     {
diff --git a/auto/Wrap/doxygenFit.i b/auto/Wrap/doxygenFit.i
index c5a3d0055d9..aa28b58963e 100644
--- a/auto/Wrap/doxygenFit.i
+++ b/auto/Wrap/doxygenFit.i
@@ -11326,6 +11326,9 @@ returns true if proposed value is in limits range
 %feature("docstring")  RealLimits::toString "std::string RealLimits::toString() const
 ";
 
+%feature("docstring")  RealLimits::check "void RealLimits::check(const std::string &name, const double value)
+";
+
 %feature("docstring")  RealLimits::isLimitless "bool RealLimits::isLimitless() const
 ";
 
diff --git a/auto/Wrap/libBornAgainFit.py b/auto/Wrap/libBornAgainFit.py
index d7b0b9649e2..33191aabc94 100644
--- a/auto/Wrap/libBornAgainFit.py
+++ b/auto/Wrap/libBornAgainFit.py
@@ -1857,6 +1857,14 @@ class RealLimits(object):
         """
         return _libBornAgainFit.RealLimits_toString(self)
 
+    def check(self, name, value):
+        r"""
+        check(RealLimits self, std::string const & name, double const value)
+        void RealLimits::check(const std::string &name, const double value)
+
+        """
+        return _libBornAgainFit.RealLimits_check(self, name, value)
+
     def __eq__(self, other):
         r"""__eq__(RealLimits self, RealLimits other) -> bool"""
         return _libBornAgainFit.RealLimits___eq__(self, other)
diff --git a/auto/Wrap/libBornAgainFit_wrap.cpp b/auto/Wrap/libBornAgainFit_wrap.cpp
index 1a63f365542..6e6989d8dbf 100644
--- a/auto/Wrap/libBornAgainFit_wrap.cpp
+++ b/auto/Wrap/libBornAgainFit_wrap.cpp
@@ -24201,6 +24201,50 @@ fail:
 }
 
 
+SWIGINTERN PyObject *_wrap_RealLimits_check(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  RealLimits *arg1 = (RealLimits *) 0 ;
+  std::string *arg2 = 0 ;
+  double arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 = SWIG_OLDOBJ ;
+  double val3 ;
+  int ecode3 = 0 ;
+  PyObject *swig_obj[3] ;
+  
+  if (!SWIG_Python_UnpackTuple(args, "RealLimits_check", 3, 3, swig_obj)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(swig_obj[0], &argp1,SWIGTYPE_p_RealLimits, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "RealLimits_check" "', argument " "1"" of type '" "RealLimits *""'"); 
+  }
+  arg1 = reinterpret_cast< RealLimits * >(argp1);
+  {
+    std::string *ptr = (std::string *)0;
+    res2 = SWIG_AsPtr_std_string(swig_obj[1], &ptr);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "RealLimits_check" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    if (!ptr) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "RealLimits_check" "', argument " "2"" of type '" "std::string const &""'"); 
+    }
+    arg2 = ptr;
+  }
+  ecode3 = SWIG_AsVal_double(swig_obj[2], &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "RealLimits_check" "', argument " "3"" of type '" "double""'");
+  } 
+  arg3 = static_cast< double >(val3);
+  (arg1)->check((std::string const &)*arg2,arg3);
+  resultobj = SWIG_Py_Void();
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return resultobj;
+fail:
+  if (SWIG_IsNewObj(res2)) delete arg2;
+  return NULL;
+}
+
+
 SWIGINTERN PyObject *_wrap_RealLimits___eq__(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   RealLimits *arg1 = (RealLimits *) 0 ;
@@ -28416,6 +28460,11 @@ static PyMethodDef SwigMethods[] = {
 		"std::string RealLimits::toString() const\n"
 		"\n"
 		""},
+	 { "RealLimits_check", _wrap_RealLimits_check, METH_VARARGS, "\n"
+		"RealLimits_check(RealLimits self, std::string const & name, double const value)\n"
+		"void RealLimits::check(const std::string &name, const double value)\n"
+		"\n"
+		""},
 	 { "RealLimits___eq__", _wrap_RealLimits___eq__, METH_VARARGS, "RealLimits___eq__(RealLimits self, RealLimits other) -> bool"},
 	 { "RealLimits___ne__", _wrap_RealLimits___ne__, METH_VARARGS, "RealLimits___ne__(RealLimits self, RealLimits other) -> bool"},
 	 { "RealLimits_isLimitless", _wrap_RealLimits_isLimitless, METH_O, "\n"
-- 
GitLab