From 33b4a64876454f6610b6fb2ab02d9e2aefaab3b8 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 10 Nov 2011 06:50:41 +0000
Subject: [PATCH] better update

---
 Common/onelab.h | 61 ++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 50 insertions(+), 11 deletions(-)

diff --git a/Common/onelab.h b/Common/onelab.h
index c655fcc419..4befed87e0 100644
--- a/Common/onelab.h
+++ b/Common/onelab.h
@@ -80,6 +80,7 @@ namespace onelab{
     bool getVisible() const { return _visible; }
     const std::set<std::string> &getClients() const { return _clients; }
     static char charSep(){ return '|' /* '\0' */; }
+    static double maxNumber(){ return 1e200; }
     std::string sanitize(const std::string &in)
     {
       std::string out(in);
@@ -134,7 +135,8 @@ namespace onelab{
     number(const std::string &name="", double defaultValue=0.,
            const std::string &shortHelp="", const std::string &help="") 
       : parameter(name, shortHelp, help), _value(defaultValue), 
-        _defaultValue(defaultValue), _min(1.), _max(0.), _step(0.) {}
+        _defaultValue(defaultValue), _min(-maxNumber()), _max(maxNumber()), 
+        _step(0.) {}
     void setValue(double value){ _value = value; }
     void setDefaultValue(double value){ _defaultValue = value; }
     void setMin(double min){ _min = min; }
@@ -144,10 +146,25 @@ namespace onelab{
     std::string getType() const { return "number"; }
     double getValue() const { return _value; }
     double getDefaultValue() const { return _defaultValue; }
-    double getMin(){ return _min; }
-    double getMax(){ return _max; }
-    double getStep(){ return _step; }
+    double getMin() const { return _min; }
+    double getMax() const { return _max; }
+    double getStep() const { return _step; }
     const std::vector<double> &getChoices(){ return _choices; }
+    void update(const number &p)
+    {
+      if(p.getValue() != getValue()){
+        setValue(p.getValue());
+        setChanged(true);
+      }
+      if(p.getDefaultValue() && p.getDefaultValue() != getDefaultValue())
+        setDefaultValue(p.getDefaultValue());
+      if(p.getMin() != -maxNumber())
+        setMin(p.getMin());
+      if(p.getMax() != maxNumber())
+        setMax(p.getMax());
+      if(p.getStep() != getStep())
+        setStep(p.getStep());
+    }
     std::string toChar()
     {
       std::ostringstream sstream;
@@ -194,11 +211,22 @@ namespace onelab{
         _defaultValue(defaultValue) {}
     void setValue(const std::string &value){ _value = value; }
     void setDefaultValue(const std::string &value){ _defaultValue = value; }
-    void setChoices(std::vector<std::string> &choices){ _choices = choices; }
+    void setChoices(const std::vector<std::string> &choices){ _choices = choices; }
     std::string getType() const { return "string"; }
     const std::string &getValue() const { return _value; }
     const std::string &getDefaultValue() const { return _defaultValue; }
-    const std::vector<std::string> &getChoices(){ return _choices; }
+    const std::vector<std::string> &getChoices() const { return _choices; }
+    void update(const string &p)
+    {
+      if(p.getValue() != getValue()){
+        setValue(p.getValue());
+        setChanged(true);
+      }
+      if(p.getDefaultValue().size() && p.getDefaultValue() != getDefaultValue())
+        setDefaultValue(p.getDefaultValue());
+      if(p.getChoices().size())
+        setChoices(p.getChoices());
+    }
     std::string toChar()
     {
       std::ostringstream sstream;
@@ -242,6 +270,13 @@ namespace onelab{
     std::string getType() const { return "region"; }
     const std::string &getValue() const { return _value; }
     const std::string &getDefaultValue() const { return _defaultValue; }
+    void update(const region &p)
+    {
+      if(p.getValue() != getValue()){
+        setValue(p.getValue());
+        setChanged(true);
+      }
+    }
     std::string toChar()
     {
       std::ostringstream sstream;
@@ -294,6 +329,13 @@ namespace onelab{
       return _pieceWiseValues; 
     }
     const std::string &getDefaultValue() const { return _defaultValue; }
+    void update(const function &p)
+    {
+      if(p.getValue() != getValue()){
+        setValue(p.getValue());
+        setChanged(true);
+      }
+    }
     std::string toChar()
     {
       std::ostringstream sstream;
@@ -324,7 +366,7 @@ namespace onelab{
     std::set<region*, parameterLessThan> _regions;
     std::set<function*, parameterLessThan> _functions;
     // set a parameter in the parameter space; if it already exists,
-    // add new clients if necessary, and (optinally) update its value.
+    // add new clients if necessary, and (optionnally) update its value.
     // This needs to be locked to avoid race conditions when several
     // clients try to set a parameter at the same time
     template <class T> bool _set(T &p, std::set<T*, parameterLessThan> &ps,
@@ -334,10 +376,7 @@ namespace onelab{
       if(it != ps.end()){
         std::set<std::string> clients = p.getClients();
         (*it)->addClients(clients);
-        if(update && p.getValue() != (*it)->getValue()){
-          (*it)->setValue(p.getValue());
-          (*it)->setChanged(true);
-        }
+        if(update) (*it)->update(p);
       }
       else{
         ps.insert(new T(p));
-- 
GitLab