From d849c8766bceea896713c394f018a0361c2fd787 Mon Sep 17 00:00:00 2001
From: Christoph Lehmann <christoph.lehmann@ufz.de>
Date: Sat, 9 Apr 2016 11:46:26 +0200
Subject: [PATCH] [AsmL] added executeMemberDereferenced()

---
 AssemblerLib/GlobalSetup.h    |  7 +++++++
 AssemblerLib/SerialExecutor.h | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/AssemblerLib/GlobalSetup.h b/AssemblerLib/GlobalSetup.h
index b795d4c55e4..fb29d3401a9 100644
--- a/AssemblerLib/GlobalSetup.h
+++ b/AssemblerLib/GlobalSetup.h
@@ -53,6 +53,13 @@ struct GlobalSetup
         return Executor::executeDereferenced(std::forward<Args>(args)...);
     }
 
+    template <typename... Args>
+    static
+    void executeMemberDereferenced(Args&& ... args)
+    {
+        return Executor::executeMemberDereferenced(std::forward<Args>(args)...);
+    }
+
     template <typename... Args>
     static
     void transform(Args&& ... args)
diff --git a/AssemblerLib/SerialExecutor.h b/AssemblerLib/SerialExecutor.h
index d3232aceac3..c369f6bef38 100644
--- a/AssemblerLib/SerialExecutor.h
+++ b/AssemblerLib/SerialExecutor.h
@@ -62,6 +62,24 @@ struct SerialExecutor
             f(i, *c[i], std::forward<Args_>(args)...);
     }
 
+    /// Executes the given \c method of the given \c object for each element
+    /// from the input \c container.
+    ///
+    /// This method is very similar to executeDereferenced().
+    ///
+    /// \see executeDereferenced()
+    template <typename Container, typename Object, typename... MethodArgs, typename... Args>
+    static void
+    executeMemberDereferenced(
+            Object& object,
+            void (Object::*method)(MethodArgs... method_args) const,
+            Container const& container, Args&&... args)
+    {
+        for (std::size_t i = 0; i < container.size(); i++) {
+            (object.*method)(i, *container[i], std::forward<Args>(args)...);
+        }
+    }
+
     /// Same as execute(f, c), but with two containers, where the second one is
     /// modified.
     ///
-- 
GitLab