From 056bcfa430567e032fc4ccdfee786e8f9e872abc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Carsten=20Gr=C3=A4ser?= <graeser@dune-project.org>
Date: Tue, 11 Jul 2017 16:47:39 +0200
Subject: [PATCH] [bugfix] Fix sparseRangeFor()

Several bugs in sparseRangeFor have been fixed.
---
 dune/matrix-vector/algorithm.hh | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/dune/matrix-vector/algorithm.hh b/dune/matrix-vector/algorithm.hh
index 5f618a1..b8bb947 100644
--- a/dune/matrix-vector/algorithm.hh
+++ b/dune/matrix-vector/algorithm.hh
@@ -15,19 +15,24 @@ namespace MatrixVector {
  * \brief Hybrid for loop over sparse range
  */
 template <class Range, class F,
-          typename = std::enable_if_t<Dune::IsTupleOrDerived<Range>::value>>
-void sparseRangeFor(const Range& range, F&& f) {
+          std::enable_if_t<Dune::IsTupleOrDerived<std::decay_t<Range>>::value, int> = 0>
+void sparseRangeFor(Range&& range, F&& f) {
   using namespace Dune::Hybrid;
-  forEach(integralRange(size(range)), [&](auto&& i) { f(range[i], i); });
+  forEach(integralRange(size(range)), [&](auto&& i) {
+      f(range[i], i);
+  });
 }
 
 /**
  * \brief Hybrid for loop over sparse range
  */
-template<class Range, class F>
+template<class Range, class F,
+          std::enable_if_t<not Dune::IsTupleOrDerived<std::decay_t<Range>>::value, int> = 0>
 void sparseRangeFor(Range&& range, F&& f)
 {
-  for (auto it = range.begin(); it != range.end(); ++it)
+  auto it = range.begin();
+  auto end = range.end();
+  for (; it != end; ++it)
     f(*it, it.index());
 }
 
-- 
GitLab