From 4e63b20ca077c283b34cdd233211c672e93f77ec Mon Sep 17 00:00:00 2001
From: Dmitrij Naumov <dmitrij@naumov.de>
Date: Fri, 23 Aug 2013 23:06:44 +0200
Subject: [PATCH] Extract AssemblerLib::SerialExecutor from vector/matrix
 builder.

Both are independent of each other.
---
 AssemblerLib/SerialExecutor.h                 | 39 +++++++++++++++++++
 AssemblerLib/SerialVectorMatrixBuilder.h      | 17 --------
 .../TestSerialLinearSolver.cpp                |  3 +-
 Tests/VecMatOnMeshLib/TestSerialVecMat.cpp    |  5 ++-
 4 files changed, 44 insertions(+), 20 deletions(-)
 create mode 100644 AssemblerLib/SerialExecutor.h

diff --git a/AssemblerLib/SerialExecutor.h b/AssemblerLib/SerialExecutor.h
new file mode 100644
index 00000000000..2943b81b4e5
--- /dev/null
+++ b/AssemblerLib/SerialExecutor.h
@@ -0,0 +1,39 @@
+/**
+ * \author Norihiro Watanabe
+ * \date   2013-04-16
+ *
+ * \copyright
+ * Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org)
+ *            Distributed under a Modified BSD License.
+ *              See accompanying file LICENSE.txt or
+ *              http://www.opengeosys.org/project/license
+ *
+ */
+
+#ifndef ASSEMBLERLIB_SERIALEXECUTOR_H_H
+#define ASSEMBLERLIB_SERIALEXECUTOR_H_H
+
+#include <vector>
+
+namespace AssemblerLib
+{
+
+/// Executes a \c f for each element in input vector.
+/// Return values of the function call are ignored.
+///
+/// \tparam T type of input vector elements
+/// \tparam F \c f type
+///
+/// \param v a vector of T pointers
+/// \param f a function that accepts a pointer to T and an index as arguments
+template <typename T, typename F>
+void
+serialExecute(std::vector<T*> const& v, F const& f)
+{
+    for (std::size_t i = 0; i < v.size(); i++)
+        f(v[i], i);
+};
+
+}   // namespace AssemblerLib
+
+#endif  // ASSEMBLERLIB_SERIALEXECUTOR_H_H
diff --git a/AssemblerLib/SerialVectorMatrixBuilder.h b/AssemblerLib/SerialVectorMatrixBuilder.h
index 0eafcbbec7f..1d73108ed19 100644
--- a/AssemblerLib/SerialVectorMatrixBuilder.h
+++ b/AssemblerLib/SerialVectorMatrixBuilder.h
@@ -13,8 +13,6 @@
 #ifndef ASSEMBLERLIB_SERIALVECTORMATRIXBUILDER_H_
 #define ASSEMBLERLIB_SERIALVECTORMATRIXBUILDER_H_
 
-#include <vector>
-
 #include "AssemblerLib/MeshComponentMap.h"
 
 namespace AssemblerLib
@@ -27,21 +25,6 @@ public:
     typedef VectorType_ VectorType;
     typedef MatrixType_ MatrixType;
 
-    /// Executes task(item, index) for each item in input vector.
-    /// Return values of the task call are ignored.
-    ///
-    /// \param vec_items   a vector of mesh item pointers
-    /// \param task        a function that accepts a mesh item pointer
-    ///                    and an index as arguments
-    template <class T_MESHITEM, class T_TASK>
-    static
-    void
-    forEachMeshItem(const std::vector<T_MESHITEM*> &vec_items, T_TASK &task)
-    {
-        for (std::size_t i=0; i<vec_items.size(); i++)
-            task(vec_items[i], i);
-    }
-
 public:
     VectorType* createVector(const MeshComponentMap &dist_layout)
     {
diff --git a/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp b/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp
index d516a23853a..b1c94eab7b2 100644
--- a/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp
+++ b/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp
@@ -20,6 +20,7 @@
 
 #include "AssemblerLib/MeshComponentMap.h"
 #include "AssemblerLib/SerialDenseVectorMatrixBuilder.h"
+#include "AssemblerLib/SerialExecutor.h"
 
 #include "MathLib/LinAlg/Dense/DenseTools.h"
 #include "MathLib/LinAlg/Solvers/GaussAlgorithm.h"
@@ -108,7 +109,7 @@ TEST(VecMatOnMeshLib, SerialLinearSolver)
 	    map_ele_nodes2vec_entries);
 
 	// Call global assembler for each mesh element.
-	SerialBuilder::forEachMeshItem(ex1.msh->getElements(), assembler);
+	AssemblerLib::serialExecute(ex1.msh->getElements(), assembler);
 
 	//std::cout << "A=\n";
 	//A->write(std::cout);
diff --git a/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp b/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp
index fdcdfba242a..eaa5b493c10 100644
--- a/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp
+++ b/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp
@@ -22,6 +22,7 @@
 
 #include "AssemblerLib/MeshComponentMap.h"
 #include "AssemblerLib/SerialDenseVectorMatrixBuilder.h"
+#include "AssemblerLib/SerialExecutor.h"
 
 #include "MathLib/LinAlg/Dense/DenseMatrix.h"
 #include "MathLib/LinAlg/Dense/DenseTools.h"
@@ -157,7 +158,7 @@ TEST(VecMatOnMeshLib, SerialVectorMatrixBuilder)
 	    *vec_left_nodes_x_coord.get(), extractX, map_node2vec_entry);
 
 	// do assembly for each selected node
-	SerialBuilder::forEachMeshItem(vec_selected_nodes, vec1Assembler);
+	AssemblerLib::serialExecute(vec_selected_nodes, vec1Assembler);
 
 	ASSERT_EQ(0.0, (*vec_left_nodes_x_coord)[0]);
 	ASSERT_EQ(0.5, (*vec_left_nodes_x_coord)[5]);
@@ -198,7 +199,7 @@ TEST(VecMatOnMeshLib, SerialVectorMatrixBuilder)
 	SetNodeDistXToMat matAssembler(*mat.get(), nodeDist, mat_data_pos);
 
 	// do assembly for each selected element
-	SerialBuilder::forEachMeshItem(vec_selected_eles, matAssembler);
+	AssemblerLib::serialExecute(vec_selected_eles, matAssembler);
 
 	ASSERT_NEAR(0.0, (*mat)(0,0), 1e-6);
 	ASSERT_NEAR(0.1, (*mat)(0,1), 1e-6);
-- 
GitLab