From 00c790fab14e2d791e07e8b99082b90dda514a6e Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Thu, 27 Oct 2016 10:05:30 +0200
Subject: [PATCH] [PL] parameter name is const now

---
 ProcessLib/Parameter/ConstantParameter.cpp    |  6 +++---
 ProcessLib/Parameter/ConstantParameter.h      | 11 ++++++++---
 ProcessLib/Parameter/CurveScaledParameter.cpp | 10 ++++++----
 ProcessLib/Parameter/CurveScaledParameter.h   |  7 ++++---
 ProcessLib/Parameter/GroupBasedParameter.cpp  | 15 ++++++++++-----
 ProcessLib/Parameter/GroupBasedParameter.h    | 15 +++++++++------
 ProcessLib/Parameter/MeshElementParameter.cpp |  5 +++--
 ProcessLib/Parameter/MeshElementParameter.h   | 11 +++++++----
 ProcessLib/Parameter/MeshNodeParameter.cpp    |  5 +++--
 ProcessLib/Parameter/MeshNodeParameter.h      | 11 +++++++----
 ProcessLib/Parameter/Parameter.cpp            | 15 +++++----------
 ProcessLib/Parameter/Parameter.h              |  6 +++++-
 12 files changed, 70 insertions(+), 47 deletions(-)

diff --git a/ProcessLib/Parameter/ConstantParameter.cpp b/ProcessLib/Parameter/ConstantParameter.cpp
index 0988a98690d..6c54129088f 100644
--- a/ProcessLib/Parameter/ConstantParameter.cpp
+++ b/ProcessLib/Parameter/ConstantParameter.cpp
@@ -15,7 +15,7 @@
 namespace ProcessLib
 {
 std::unique_ptr<ParameterBase> createConstantParameter(
-    BaseLib::ConfigTree const& config)
+    std::string const& name, BaseLib::ConfigTree const& config)
 {
     //! \ogs_file_param{parameter__type}
     config.checkConfigParameter("type", "Constant");
@@ -31,7 +31,7 @@ std::unique_ptr<ParameterBase> createConstantParameter(
         {
             DBUG("Using value %g for constant parameter.", *value);
             return std::unique_ptr<ParameterBase>(
-                new ConstantParameter<double>(*value));
+                new ConstantParameter<double>(name, *value));
         }
     }
 
@@ -51,7 +51,7 @@ std::unique_ptr<ParameterBase> createConstantParameter(
     }
 
     return std::unique_ptr<ParameterBase>(
-        new ConstantParameter<double>(values));
+        new ConstantParameter<double>(name, values));
 }
 
 }  // ProcessLib
diff --git a/ProcessLib/Parameter/ConstantParameter.h b/ProcessLib/Parameter/ConstantParameter.h
index 2c48d5c88a0..4de95d2ed67 100644
--- a/ProcessLib/Parameter/ConstantParameter.h
+++ b/ProcessLib/Parameter/ConstantParameter.h
@@ -19,11 +19,16 @@ template <typename T>
 struct ConstantParameter final : public Parameter<T>
 {
     /// Construction with single value.
-    explicit ConstantParameter(T const& value) : _values({value}) {}
+    explicit ConstantParameter(std::string const& name_, T const& value)
+        : Parameter<T>(name_), _values({value})
+    {
+    }
 
     /// Construction with a tuple.
     /// The given tuple must be non-empty.
-    explicit ConstantParameter(std::vector<T> const& values) : _values(values)
+    explicit ConstantParameter(std::string const& name_,
+                               std::vector<T> const& values)
+        : Parameter<T>(name_), _values(values)
     {
         assert(!values.empty());
     }
@@ -46,7 +51,7 @@ private:
 };
 
 std::unique_ptr<ParameterBase> createConstantParameter(
-    BaseLib::ConfigTree const& config);
+    std::string const& name, BaseLib::ConfigTree const& config);
 
 }  // ProcessLib
 
diff --git a/ProcessLib/Parameter/CurveScaledParameter.cpp b/ProcessLib/Parameter/CurveScaledParameter.cpp
index e0c3e414cdd..e90d3e9f116 100644
--- a/ProcessLib/Parameter/CurveScaledParameter.cpp
+++ b/ProcessLib/Parameter/CurveScaledParameter.cpp
@@ -13,6 +13,7 @@
 namespace ProcessLib
 {
 std::unique_ptr<ParameterBase> createCurveScaledParameter(
+    std::string const& name,
     BaseLib::ConfigTree const& config,
     std::map<std::string,
              std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
@@ -30,12 +31,13 @@ std::unique_ptr<ParameterBase> createCurveScaledParameter(
         OGS_FATAL("Curve `%s' does not exists.", curve_name.c_str());
 
     //! \ogs_file_param{parameter__CurveScaled__parameter}
-    auto parameter_name = config.getConfigParameter<std::string>("parameter");
-    DBUG("Using parameter %s", parameter_name.c_str());
+    auto referenced_parameter_name =
+            config.getConfigParameter<std::string>("parameter");
+    DBUG("Using parameter %s", referenced_parameter_name.c_str());
 
     // TODO other data types than only double
-    return std::unique_ptr<ParameterBase>(
-        new CurveScaledParameter<double>(*curve_it->second, parameter_name));
+    return std::unique_ptr<ParameterBase>(new CurveScaledParameter<double>(
+        name, *curve_it->second, referenced_parameter_name));
 }
 
 }  // ProcessLib
diff --git a/ProcessLib/Parameter/CurveScaledParameter.h b/ProcessLib/Parameter/CurveScaledParameter.h
index 5ff5b640d00..1f5ce15f79a 100644
--- a/ProcessLib/Parameter/CurveScaledParameter.h
+++ b/ProcessLib/Parameter/CurveScaledParameter.h
@@ -19,10 +19,10 @@ namespace ProcessLib
 {
 template <typename T>
 struct CurveScaledParameter final : public Parameter<T> {
-    CurveScaledParameter(MathLib::PiecewiseLinearInterpolation const& curve,
+    CurveScaledParameter(std::string const& name_,
+                         MathLib::PiecewiseLinearInterpolation const& curve,
                          std::string const& parameter_name)
-        : _curve(curve),
-          _parameter_name(parameter_name)
+        : Parameter<T>(name_), _curve(curve), _parameter_name(parameter_name)
     {
     }
 
@@ -63,6 +63,7 @@ private:
 };
 
 std::unique_ptr<ParameterBase> createCurveScaledParameter(
+    std::string const& name,
     BaseLib::ConfigTree const& config,
     std::map<std::string,
              std::unique_ptr<MathLib::PiecewiseLinearInterpolation>> const&
diff --git a/ProcessLib/Parameter/GroupBasedParameter.cpp b/ProcessLib/Parameter/GroupBasedParameter.cpp
index 5be4cb0da5f..93ecc84c73f 100644
--- a/ProcessLib/Parameter/GroupBasedParameter.cpp
+++ b/ProcessLib/Parameter/GroupBasedParameter.cpp
@@ -16,7 +16,8 @@
 namespace ProcessLib
 {
 std::unique_ptr<ParameterBase> createGroupBasedParameter(
-    BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh)
+    std::string const& name, BaseLib::ConfigTree const& config,
+    MeshLib::Mesh const& mesh)
 {
     //! \ogs_file_param{parameter__type}
     config.checkConfigParameter("type", "Group");
@@ -79,17 +80,21 @@ std::unique_ptr<ParameterBase> createGroupBasedParameter(
     }
 
     // create a mapping table
-    const int max_index = *std::max_element(group_id_property->begin(), group_id_property->end());
+    const int max_index =
+        *std::max_element(group_id_property->begin(), group_id_property->end());
     std::vector<Values> vec_values(max_index + 1);
     for (auto p : vec_index_values)
         vec_values[p.first] = p.second;
 
     if (group_id_property->getMeshItemType() == MeshLib::MeshItemType::Node)
         return std::unique_ptr<ParameterBase>(
-            new GroupBasedParameter<double, MeshLib::MeshItemType::Node>(*group_id_property, vec_values));
-    else if (group_id_property->getMeshItemType() == MeshLib::MeshItemType::Cell)
+            new GroupBasedParameter<double, MeshLib::MeshItemType::Node>(
+                name, *group_id_property, vec_values));
+    else if (group_id_property->getMeshItemType() ==
+             MeshLib::MeshItemType::Cell)
         return std::unique_ptr<ParameterBase>(
-            new GroupBasedParameter<double, MeshLib::MeshItemType::Cell>(*group_id_property, vec_values));
+            new GroupBasedParameter<double, MeshLib::MeshItemType::Cell>(
+                name, *group_id_property, vec_values));
 
     OGS_FATAL("Mesh item type of the specified property is not supported.");
 }
diff --git a/ProcessLib/Parameter/GroupBasedParameter.h b/ProcessLib/Parameter/GroupBasedParameter.h
index 70e0ae65a31..310e79df7d4 100644
--- a/ProcessLib/Parameter/GroupBasedParameter.h
+++ b/ProcessLib/Parameter/GroupBasedParameter.h
@@ -37,10 +37,12 @@ struct GroupBasedParameter final
      * @param property    a property vector of index for mesh items
      * @param vec_values  a vector of values for each index
      */
-    GroupBasedParameter(
-        MeshLib::PropertyVector<int> const& property,
-        std::vector<std::vector<double>> const& vec_values)
-        : _property_index(property), _vec_values(vec_values)
+    GroupBasedParameter(std::string const& name_,
+                        MeshLib::PropertyVector<int> const& property,
+                        std::vector<std::vector<double>> const& vec_values)
+        : Parameter<T>(name_),
+          _property_index(property),
+          _vec_values(vec_values)
     {
     }
 
@@ -82,9 +84,10 @@ private:
     std::vector<std::vector<T>> const _vec_values;
 };
 
-
 std::unique_ptr<ParameterBase> createGroupBasedParameter(
-    BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh);
+    std::string const& name,
+    BaseLib::ConfigTree const& config,
+    MeshLib::Mesh const& mesh);
 
 }  // ProcessLib
 
diff --git a/ProcessLib/Parameter/MeshElementParameter.cpp b/ProcessLib/Parameter/MeshElementParameter.cpp
index d21ffdeb9df..3bf3a494eee 100644
--- a/ProcessLib/Parameter/MeshElementParameter.cpp
+++ b/ProcessLib/Parameter/MeshElementParameter.cpp
@@ -15,7 +15,8 @@
 namespace ProcessLib
 {
 std::unique_ptr<ParameterBase> createMeshElementParameter(
-    BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh)
+    std::string const& name, BaseLib::ConfigTree const& config,
+    MeshLib::Mesh const& mesh)
 {
     //! \ogs_file_param{parameter__type}
     config.checkConfigParameter("type", "MeshElement");
@@ -42,7 +43,7 @@ std::unique_ptr<ParameterBase> createMeshElementParameter(
     }
 
     return std::unique_ptr<ParameterBase>(
-        new MeshElementParameter<double>(*property));
+        new MeshElementParameter<double>(name, *property));
 }
 
 }  // ProcessLib
diff --git a/ProcessLib/Parameter/MeshElementParameter.h b/ProcessLib/Parameter/MeshElementParameter.h
index 9058ca0c3f3..3d73cfd0818 100644
--- a/ProcessLib/Parameter/MeshElementParameter.h
+++ b/ProcessLib/Parameter/MeshElementParameter.h
@@ -23,9 +23,11 @@ namespace ProcessLib
 /// A parameter represented by a mesh property vector.
 template <typename T>
 struct MeshElementParameter final : public Parameter<T> {
-    MeshElementParameter(MeshLib::PropertyVector<T> const& property)
-        : _property(property)
-        , _cache(_property.getNumberOfComponents())
+    MeshElementParameter(std::string const& name_,
+                         MeshLib::PropertyVector<T> const& property)
+        : Parameter<T>(name_),
+          _property(property),
+          _cache(_property.getNumberOfComponents())
     {
     }
 
@@ -54,7 +56,8 @@ private:
 };
 
 std::unique_ptr<ParameterBase> createMeshElementParameter(
-    BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh);
+    std::string const& name, BaseLib::ConfigTree const& config,
+    MeshLib::Mesh const& mesh);
 
 }  // ProcessLib
 
diff --git a/ProcessLib/Parameter/MeshNodeParameter.cpp b/ProcessLib/Parameter/MeshNodeParameter.cpp
index af986ad603c..3470d40cb1b 100644
--- a/ProcessLib/Parameter/MeshNodeParameter.cpp
+++ b/ProcessLib/Parameter/MeshNodeParameter.cpp
@@ -15,7 +15,8 @@
 namespace ProcessLib
 {
 std::unique_ptr<ParameterBase> createMeshNodeParameter(
-    BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh)
+    std::string const& name, BaseLib::ConfigTree const& config,
+    MeshLib::Mesh const& mesh)
 {
     //! \ogs_file_param{parameter__type}
     config.checkConfigParameter("type", "MeshNode");
@@ -42,7 +43,7 @@ std::unique_ptr<ParameterBase> createMeshNodeParameter(
     }
 
     return std::unique_ptr<ParameterBase>(
-        new MeshNodeParameter<double>(*property));
+        new MeshNodeParameter<double>(name, *property));
 }
 
 }  // ProcessLib
diff --git a/ProcessLib/Parameter/MeshNodeParameter.h b/ProcessLib/Parameter/MeshNodeParameter.h
index dd39a0ff7ff..587bfd462c0 100644
--- a/ProcessLib/Parameter/MeshNodeParameter.h
+++ b/ProcessLib/Parameter/MeshNodeParameter.h
@@ -23,9 +23,11 @@ namespace ProcessLib
 /// A parameter represented by a mesh property vector.
 template <typename T>
 struct MeshNodeParameter final : public Parameter<T> {
-    MeshNodeParameter(MeshLib::PropertyVector<T> const& property)
-        : _property(property)
-        , _cache(_property.getNumberOfComponents())
+    MeshNodeParameter(std::string const& name_,
+                      MeshLib::PropertyVector<T> const& property)
+        : Parameter<T>(name_),
+          _property(property),
+          _cache(_property.getNumberOfComponents())
     {
     }
 
@@ -54,7 +56,8 @@ private:
 };
 
 std::unique_ptr<ParameterBase> createMeshNodeParameter(
-    BaseLib::ConfigTree const& config, MeshLib::Mesh const& mesh);
+    std::string const& name, BaseLib::ConfigTree const& config,
+    MeshLib::Mesh const& mesh);
 
 }  // ProcessLib
 
diff --git a/ProcessLib/Parameter/Parameter.cpp b/ProcessLib/Parameter/Parameter.cpp
index 4a6f226a2e1..5078403cfd4 100644
--- a/ProcessLib/Parameter/Parameter.cpp
+++ b/ProcessLib/Parameter/Parameter.cpp
@@ -36,36 +36,31 @@ std::unique_ptr<ParameterBase> createParameter(
     if (type == "Constant")
     {
         INFO("ConstantParameter: %s", name.c_str());
-        auto param = createConstantParameter(config);
-        param->name = name;
+        auto param = createConstantParameter(name, config);
         return param;
     }
     else if (type == "CurveScaled")
     {
         INFO("CurveScaledParameter: %s", name.c_str());
-        auto param = createCurveScaledParameter(config, curves);
-        param->name = name;
+        auto param = createCurveScaledParameter(name, config, curves);
         return param;
     }
     else if (type == "Group")
     {
         INFO("GroupBasedParameter: %s", name.c_str());
-        auto param = createGroupBasedParameter(config, *meshes.front());
-        param->name = name;
+        auto param = createGroupBasedParameter(name, config, *meshes.front());
         return param;
     }
     else if (type == "MeshElement")
     {
         INFO("MeshElementParameter: %s", name.c_str());
-        auto param = createMeshElementParameter(config, *meshes.front());
-        param->name = name;
+        auto param = createMeshElementParameter(name, config, *meshes.front());
         return param;
     }
     else if (type == "MeshNode")
     {
         INFO("MeshElementParameter: %s", name.c_str());
-        auto param = createMeshNodeParameter(config, *meshes.front());
-        param->name = name;
+        auto param = createMeshNodeParameter(name, config, *meshes.front());
         return param;
     }
     else
diff --git a/ProcessLib/Parameter/Parameter.h b/ProcessLib/Parameter/Parameter.h
index ac4208ff81a..53c3ac7289d 100644
--- a/ProcessLib/Parameter/Parameter.h
+++ b/ProcessLib/Parameter/Parameter.h
@@ -37,6 +37,8 @@ namespace ProcessLib
 /// Its property name helps addressing the right parameter.
 struct ParameterBase
 {
+    ParameterBase(std::string const& name_) : name(name_) {}
+
     virtual ~ParameterBase() = default;
 
     virtual bool isTimeDependent() const = 0;
@@ -49,7 +51,7 @@ struct ParameterBase
     {
     }
 
-    std::string name;
+    std::string const name;
 };
 
 /*! A Parameter is a function \f$ (t, x) \mapsto f(t, x) \in T^n \f$.
@@ -61,6 +63,8 @@ struct ParameterBase
 template <typename T>
 struct Parameter : public ParameterBase
 {
+    Parameter(std::string const& name_) : ParameterBase(name_) {}
+
     virtual ~Parameter() = default;
 
     //! Returns the number of components this Parameter has at every position and
-- 
GitLab