From d6a8f8b0b3dbef7a50f49c08d9dc967118068cbe Mon Sep 17 00:00:00 2001
From: Thomas Fischer <thomas.fischer@ufz.de>
Date: Thu, 18 May 2017 14:08:56 +0200
Subject: [PATCH] [MGTL] Use pntr. to store search_length_algorithm.

This is needed for polymorphism of the SearchLength alg.
---
 .../CreateBoundaryConditionsAlongPolylines.cpp   |  7 ++++---
 MeshGeoToolsLib/CreateSearchLength.h             | 13 +++++++++----
 MeshGeoToolsLib/MeshNodeSearcher.cpp             | 16 ++++++++--------
 MeshGeoToolsLib/MeshNodeSearcher.h               |  8 +++++---
 .../BoundaryCondition/BoundaryCondition.cpp      |  6 +++---
 .../BoundaryConditionBuilder.cpp                 |  5 +++--
 Tests/MeshLib/TestBoundaryElementSearch.cpp      | 10 +++++++---
 Tests/MeshLib/TestMeshNodeSearch.cpp             | 15 ++++++++++-----
 .../LocalToGlobalIndexMapMultiComponent.cpp      |  3 ++-
 Tests/NumLib/TestDistribution.cpp                |  8 ++++++--
 10 files changed, 57 insertions(+), 34 deletions(-)

diff --git a/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp b/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp
index 99928d989d0..09551a33782 100644
--- a/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp
+++ b/Applications/Utils/MeshEdit/CreateBoundaryConditionsAlongPolylines.cpp
@@ -197,10 +197,11 @@ int main (int argc, char* argv[])
         return EXIT_FAILURE;
     }
 
-    MeshGeoToolsLib::SearchLength search_length_strategy;
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_strategy{
+        new MeshGeoToolsLib::SearchLength};
     if (search_length_arg.isSet()) {
-        search_length_strategy =
-            MeshGeoToolsLib::SearchLength(search_length_arg.getValue());
+        search_length_strategy.reset(
+            new MeshGeoToolsLib::SearchLength(search_length_arg.getValue()));
     }
 
     GeoLib::GEOObjects geometry_sets;
diff --git a/MeshGeoToolsLib/CreateSearchLength.h b/MeshGeoToolsLib/CreateSearchLength.h
index cf974de42c3..769b5185ba5 100644
--- a/MeshGeoToolsLib/CreateSearchLength.h
+++ b/MeshGeoToolsLib/CreateSearchLength.h
@@ -11,6 +11,8 @@
 
 #pragma once
 
+#include <memory>
+
 #include "BaseLib/ConfigTree.h"
 
 #include "MeshGeoToolsLib/HeuristicSearchLength.h"
@@ -18,7 +20,7 @@
 
 namespace MeshGeoToolsLib
 {
-MeshGeoToolsLib::SearchLength createSearchLengthAlgorithm(
+std::unique_ptr<MeshGeoToolsLib::SearchLength> createSearchLengthAlgorithm(
     BaseLib::ConfigTree const& external_config, MeshLib::Mesh const& mesh)
 {
     boost::optional<BaseLib::ConfigTree> config =
@@ -26,7 +28,8 @@ MeshGeoToolsLib::SearchLength createSearchLengthAlgorithm(
         external_config.getConfigSubtreeOptional("search_length_algorithm");
 
     if (!config)
-        return MeshGeoToolsLib::SearchLength();
+        return std::unique_ptr<MeshGeoToolsLib::SearchLength>{
+            new MeshGeoToolsLib::SearchLength()};
 
     //! \ogs_file_param{prj__search_length_algorithm__type}
     std::string const type = config->getConfigParameter<std::string>("type");
@@ -35,11 +38,13 @@ MeshGeoToolsLib::SearchLength createSearchLengthAlgorithm(
     {
         //! \ogs_file_param{prj__search_length_algorithm__value}
         double const length = config->getConfigParameter<double>("value");
-        return MeshGeoToolsLib::SearchLength(length);
+        return std::unique_ptr<MeshGeoToolsLib::SearchLength>{
+            new MeshGeoToolsLib::SearchLength(length)};
     }
     if (type == "heuristic")
     {
-        return MeshGeoToolsLib::HeuristicSearchLength(mesh);
+        return std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength>{
+            new MeshGeoToolsLib::HeuristicSearchLength(mesh)};
     }
     OGS_FATAL("Unknown search length algorithm type '%s'.", type.c_str());
 }
diff --git a/MeshGeoToolsLib/MeshNodeSearcher.cpp b/MeshGeoToolsLib/MeshNodeSearcher.cpp
index 1d3469a189f..6b328cdbd6c 100644
--- a/MeshGeoToolsLib/MeshNodeSearcher.cpp
+++ b/MeshGeoToolsLib/MeshNodeSearcher.cpp
@@ -33,7 +33,7 @@ std::vector<std::unique_ptr<MeshNodeSearcher>> MeshNodeSearcher::_mesh_node_sear
 
 MeshNodeSearcher::MeshNodeSearcher(
     MeshLib::Mesh const& mesh,
-    MeshGeoToolsLib::SearchLength&& search_length_algorithm,
+    std::unique_ptr<MeshGeoToolsLib::SearchLength>&& search_length_algorithm,
     SearchAllNodes search_all_nodes)
     : _mesh(mesh),
       _mesh_grid(_mesh.getNodes().cbegin(), _mesh.getNodes().cend()),
@@ -41,7 +41,7 @@ MeshNodeSearcher::MeshNodeSearcher(
       _search_all_nodes(search_all_nodes)
 {
     DBUG("The search length for mesh \"%s\" is %e.",
-        _mesh.getName().c_str(), _search_length_algorithm.getSearchLength());
+        _mesh.getName().c_str(), _search_length_algorithm->getSearchLength());
 }
 
 MeshNodeSearcher::~MeshNodeSearcher()
@@ -108,7 +108,7 @@ MeshNodesOnPoint& MeshNodeSearcher::getMeshNodesOnPoint(
         new MeshNodesOnPoint(_mesh,
                              _mesh_grid,
                              pnt,
-                             _search_length_algorithm.getSearchLength(),
+                             _search_length_algorithm->getSearchLength(),
                              _search_all_nodes));
     return *_mesh_nodes_on_points.back();
 }
@@ -126,7 +126,7 @@ MeshNodesAlongPolyline& MeshNodeSearcher::getMeshNodesAlongPolyline(
 
     // compute nodes (and supporting points) along polyline
     _mesh_nodes_along_polylines.push_back(new MeshNodesAlongPolyline(
-        _mesh, ply, _search_length_algorithm.getSearchLength(),
+        _mesh, ply, _search_length_algorithm->getSearchLength(),
         _search_all_nodes));
     return *_mesh_nodes_along_polylines.back();
 }
@@ -146,14 +146,14 @@ MeshNodesAlongSurface& MeshNodeSearcher::getMeshNodesAlongSurface(
     _mesh_nodes_along_surfaces.push_back(
         new MeshNodesAlongSurface(_mesh,
                                   sfc,
-                                  _search_length_algorithm.getSearchLength(),
+                                  _search_length_algorithm->getSearchLength(),
                                   _search_all_nodes));
     return *_mesh_nodes_along_surfaces.back();
 }
 
 MeshNodeSearcher const& MeshNodeSearcher::getMeshNodeSearcher(
     MeshLib::Mesh const& mesh,
-    MeshGeoToolsLib::SearchLength&& search_length_algorithm)
+    std::unique_ptr<MeshGeoToolsLib::SearchLength>&& search_length_algorithm)
 {
     std::size_t const mesh_id = mesh.getID();
     if (_mesh_node_searchers.size() < mesh_id+1)
@@ -166,8 +166,8 @@ MeshNodeSearcher const& MeshNodeSearcher::getMeshNodeSearcher(
         // lenght are the same, else recreate the searcher
         if (typeid(m._search_length_algorithm) ==
                 typeid(search_length_algorithm) &&
-            m._search_length_algorithm.getSearchLength() ==
-                search_length_algorithm.getSearchLength())
+            m._search_length_algorithm->getSearchLength() ==
+                search_length_algorithm->getSearchLength())
         {
             return m;
         }
diff --git a/MeshGeoToolsLib/MeshNodeSearcher.h b/MeshGeoToolsLib/MeshNodeSearcher.h
index 11c698efcac..2d682df1f24 100644
--- a/MeshGeoToolsLib/MeshNodeSearcher.h
+++ b/MeshGeoToolsLib/MeshNodeSearcher.h
@@ -62,7 +62,8 @@ public:
      * searching the base nodes.
      */
     MeshNodeSearcher(MeshLib::Mesh const& mesh,
-                     MeshGeoToolsLib::SearchLength&& search_length_algorithm,
+                     std::unique_ptr<MeshGeoToolsLib::SearchLength>&&
+                         search_length_algorithm,
                      SearchAllNodes search_all_nodes);
 
     virtual ~MeshNodeSearcher();
@@ -142,12 +143,13 @@ public:
      */
     static MeshNodeSearcher const& getMeshNodeSearcher(
         MeshLib::Mesh const& mesh,
-        MeshGeoToolsLib::SearchLength&& search_length_algorithm);
+        std::unique_ptr<MeshGeoToolsLib::SearchLength>&&
+            search_length_algorithm);
 
 private:
     MeshLib::Mesh const& _mesh;
     GeoLib::Grid<MeshLib::Node> _mesh_grid;
-    MeshGeoToolsLib::SearchLength _search_length_algorithm;
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> _search_length_algorithm;
     SearchAllNodes _search_all_nodes;
     // with newer compiler we can omit to use a pointer here
     mutable std::vector<MeshNodesOnPoint*> _mesh_nodes_on_points;
diff --git a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
index 2af1707012b..98a44215c09 100644
--- a/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
+++ b/ProcessLib/BoundaryCondition/BoundaryCondition.cpp
@@ -62,7 +62,7 @@ BoundaryConditionBuilder::createDirichletBoundaryCondition(
     const unsigned /*shapefunction_order*/,
     const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters)
 {
-    MeshGeoToolsLib::SearchLength search_length_algorithm =
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_algorithm =
         MeshGeoToolsLib::createSearchLengthAlgorithm(config.config, mesh);
 
     MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher =
@@ -116,7 +116,7 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
     const unsigned shapefunction_order,
     const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters)
 {
-    MeshGeoToolsLib::SearchLength search_length_algorithm =
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_algorithm =
         MeshGeoToolsLib::createSearchLengthAlgorithm(config.config, mesh);
 
     MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher =
@@ -142,7 +142,7 @@ BoundaryConditionBuilder::createRobinBoundaryCondition(
     const unsigned shapefunction_order,
     const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters)
 {
-    MeshGeoToolsLib::SearchLength search_length_algorithm =
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_algorithm =
         MeshGeoToolsLib::createSearchLengthAlgorithm(config.config, mesh);
 
     MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher =
diff --git a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
index a79074eb986..98027d69cb3 100644
--- a/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
+++ b/ProcessLib/LIE/BoundaryCondition/BoundaryConditionBuilder.cpp
@@ -29,10 +29,11 @@ BoundaryConditionBuilder::createNeumannBoundaryCondition(
     const unsigned shapefunction_order,
     const std::vector<std::unique_ptr<ProcessLib::ParameterBase>>& parameters)
 {
-    MeshGeoToolsLib::SearchLength search_length_algorithm;
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length_strategy{
+        new MeshGeoToolsLib::SearchLength};
     MeshGeoToolsLib::MeshNodeSearcher const& mesh_node_searcher =
         MeshGeoToolsLib::MeshNodeSearcher::getMeshNodeSearcher(
-            mesh, std::move(search_length_algorithm));
+            mesh, std::move(search_length_strategy));
 
     MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher(
         mesh, mesh_node_searcher);
diff --git a/Tests/MeshLib/TestBoundaryElementSearch.cpp b/Tests/MeshLib/TestBoundaryElementSearch.cpp
index 25a20a4caf4..f5077d4f674 100644
--- a/Tests/MeshLib/TestBoundaryElementSearch.cpp
+++ b/Tests/MeshLib/TestBoundaryElementSearch.cpp
@@ -78,8 +78,10 @@ TEST_F(MeshLibBoundaryElementSearchInSimpleQuadMesh, PolylineSearch)
     ply0.addPoint(0);
 
     // perform search on the polyline
-    MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh,
-        MeshGeoToolsLib::HeuristicSearchLength(*_quad_mesh),
+    MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(
+        *_quad_mesh,
+        std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength>{
+            new MeshGeoToolsLib::HeuristicSearchLength(*_quad_mesh)},
         MeshGeoToolsLib::SearchAllNodes::Yes);
     MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher(*_quad_mesh, mesh_node_searcher);
     std::vector<MeshLib::Element*> const& found_edges_ply0(boundary_element_searcher.getBoundaryElements(ply0));
@@ -148,7 +150,9 @@ TEST_F(MeshLibBoundaryElementSearchInSimpleHexMesh, SurfaceSearch)
 
     // perform search on the bottom surface
     MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(
-        *_hex_mesh, MeshGeoToolsLib::HeuristicSearchLength(*_hex_mesh),
+        *_hex_mesh,
+        std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength>{
+            new MeshGeoToolsLib::HeuristicSearchLength(*_hex_mesh)},
         MeshGeoToolsLib::SearchAllNodes::Yes);
     MeshGeoToolsLib::BoundaryElementsSearcher boundary_element_searcher(*_hex_mesh, mesh_node_searcher);
     std::vector<MeshLib::Element*> const& found_faces_sfc_b(boundary_element_searcher.getBoundaryElements(*sfc_bottom));
diff --git a/Tests/MeshLib/TestMeshNodeSearch.cpp b/Tests/MeshLib/TestMeshNodeSearch.cpp
index fbc28fd917b..6bdd6166024 100644
--- a/Tests/MeshLib/TestMeshNodeSearch.cpp
+++ b/Tests/MeshLib/TestMeshNodeSearch.cpp
@@ -66,7 +66,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, PointSearchEpsHalfEdge)
     ASSERT_TRUE(_quad_mesh != nullptr);
 
     // 2 perform search and compare results with expected vals
-    MeshGeoToolsLib::SearchLength search_length(dx_half);
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{
+        new MeshGeoToolsLib::SearchLength(dx_half)};
     MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh,
         std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes);
 
@@ -92,7 +93,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, PointSearchZeroEps)
     // 1 create a geometry
 
     // 2 perform search and compare results with expected vals
-    MeshGeoToolsLib::SearchLength search_length;
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{
+        new MeshGeoToolsLib::SearchLength};
     MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh,
         std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes);
 
@@ -138,7 +140,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, PolylineSearch)
     ply0.addPoint(1);
 
     // perform search and compare results with expected vals
-    MeshGeoToolsLib::HeuristicSearchLength search_length(*_quad_mesh);
+    std::unique_ptr<MeshGeoToolsLib::HeuristicSearchLength> search_length{
+        new MeshGeoToolsLib::HeuristicSearchLength(*_quad_mesh)};
     MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh,
         std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes);
     std::vector<std::size_t> const& found_ids_ply0(mesh_node_searcher.getMeshNodeIDsAlongPolyline(ply0));
@@ -220,7 +223,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleQuadMesh, SurfaceSearch)
     pnts.push_back(new GeoLib::Point(_geometric_size, 0.5*_geometric_size, 0.0));
     pnts.push_back(new GeoLib::Point(0.0, 0.5*_geometric_size, 0.0));
 
-    MeshGeoToolsLib::SearchLength search_length;
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{
+        new MeshGeoToolsLib::SearchLength};
     MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_quad_mesh,
         std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes);
 
@@ -271,7 +275,8 @@ TEST_F(MeshLibMeshNodeSearchInSimpleHexMesh, SurfaceSearch)
     pnts.push_back(new GeoLib::Point(_geometric_size, _geometric_size, _geometric_size));
     pnts.push_back(new GeoLib::Point(0.0, _geometric_size, _geometric_size));
 
-    MeshGeoToolsLib::SearchLength search_length;
+    std::unique_ptr<MeshGeoToolsLib::SearchLength> search_length{
+        new MeshGeoToolsLib::SearchLength};
     MeshGeoToolsLib::MeshNodeSearcher mesh_node_searcher(*_hex_mesh,
         std::move(search_length), MeshGeoToolsLib::SearchAllNodes::Yes);
 
diff --git a/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp b/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp
index 723ace16e5a..04fa8ed191d 100644
--- a/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp
+++ b/Tests/NumLib/LocalToGlobalIndexMapMultiComponent.cpp
@@ -55,7 +55,8 @@ public:
 
         geo_objs.addPolylineVec(std::move(plys), geometry_0, nullptr);
 
-        MGTL::SearchLength search_length;
+        std::unique_ptr<MGTL::SearchLength> search_length{
+            new MGTL::SearchLength};
         MGTL::MeshNodeSearcher const& searcher_nodes =
             MGTL::MeshNodeSearcher::getMeshNodeSearcher(
                 *mesh, std::move(search_length));
diff --git a/Tests/NumLib/TestDistribution.cpp b/Tests/NumLib/TestDistribution.cpp
index 4fc9016b8c7..055a16ac14a 100644
--- a/Tests/NumLib/TestDistribution.cpp
+++ b/Tests/NumLib/TestDistribution.cpp
@@ -35,7 +35,9 @@ public:
           _msh(MeshLib::MeshGenerator::generateRegularQuadMesh(
               _geometric_size, _number_of_subdivisions_per_direction)),
           _project_name("test"),
-          _mshNodesSearcher(*_msh, MeshGeoToolsLib::SearchLength(),
+          _mshNodesSearcher(*_msh,
+                            std::unique_ptr<MeshGeoToolsLib::SearchLength>{
+                                new MeshGeoToolsLib::SearchLength},
                             MeshGeoToolsLib::SearchAllNodes::Yes),
           _ply0(nullptr)
     {
@@ -92,7 +94,9 @@ public:
           _msh(MeshLib::MeshGenerator::generateRegularHexMesh(
               _geometric_size, _number_of_subdivisions_per_direction)),
           _project_name("test"),
-          _mshNodesSearcher(*_msh, MeshGeoToolsLib::SearchLength(),
+          _mshNodesSearcher(*_msh,
+                            std::unique_ptr<MeshGeoToolsLib::SearchLength>{
+                                new MeshGeoToolsLib::SearchLength},
                             MeshGeoToolsLib::SearchAllNodes::Yes),
           _ply0(nullptr)
     {
-- 
GitLab