From a1c957981a44b5689a966a2f9c82fabc55a4c5b5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carsten=20Gr=C3=A4ser?= <graeser@dune-project.org>
Date: Tue, 15 Mar 2016 14:17:50 +0100
Subject: [PATCH] Add a hybrid loop over a sparse range

---
 dune/solvers/common/algorithm.hh | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/dune/solvers/common/algorithm.hh b/dune/solvers/common/algorithm.hh
index 65181d8b..ecec1416 100644
--- a/dune/solvers/common/algorithm.hh
+++ b/dune/solvers/common/algorithm.hh
@@ -242,6 +242,33 @@ constexpr auto hybridSize(const T& t)
 
 
 
+/**
+ * \brief Hybrid for loop over sparse range
+ */
+template<class... T, class F>
+void sparseRangeFor(Dune::MultiTypeBlockMatrix<T...>& range, F&& f)
+{
+  integralRangeFor<std::size_t>(Indices::_0, hybridSize(range), [&](auto&& i) {
+      f(range[i], i);
+  });
+}
+
+
+
+/**
+ * \brief Hybrid for loop over sparse range
+ */
+template<class Range, class F>
+void sparseRangeFor(Range&& range, F&& f)
+{
+  auto it = range.begin();
+  auto end = range.end();
+  for(; it!=end; ++it)
+    f(*it, it.index());
+}
+
+
+
 } // namespace Solvers
 } // namespace Dune
 
-- 
GitLab