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