diff --git a/dune/matrix-vector/algorithm.hh b/dune/matrix-vector/algorithm.hh index 5f618a1bdcffbd5e4359658bc6ab4e2674e58afb..b8bb947371ee83fe1fefce12a5b688e011fa34b8 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()); }