diff --git a/dune/matrix-vector/algorithm.hh b/dune/matrix-vector/algorithm.hh index e17bc072997ed18249c9fb7b9dcb8a66008da4a4..526b542e19fc370db1f0d146a248039f35696fef 100644 --- a/dune/matrix-vector/algorithm.hh +++ b/dune/matrix-vector/algorithm.hh @@ -7,27 +7,27 @@ #include <dune/common/hybridutilities.hh> #include <dune/common/typetraits.hh> +#include <dune/common/std/type_traits.hh> namespace Dune { namespace MatrixVector { -/** - * \brief Hybrid for loop over sparse range - */ -template <class Range, class F, - std::enable_if_t<Dune::IsTupleOrDerived<std::decay_t<Range>>::value, int> = 0> +template<class T> +constexpr auto isTupleOrDerived() { + return Std::bool_constant<IsTupleOrDerived<std::decay_t<T>>::value>(); +} + +//! \brief Hybrid for loop over sparse range (static/tuple-like candidate) +template <class Range, class F, std::enable_if_t<isTupleOrDerived<Range>(), int> = 0> void sparseRangeFor(Range&& range, F&& f) { using namespace Dune::Hybrid; - forEach(integralRange(Dune::Hybrid::size(range)), [&](auto&& i) { + forEach(integralRange(size(range)), [&](auto&& i) { f(range[i], i); }); } -/** - * \brief Hybrid for loop over sparse range - */ -template<class Range, class F, - std::enable_if_t<not Dune::IsTupleOrDerived<std::decay_t<Range>>::value, int> = 0> +//! \brief Hybrid for loop over sparse range (dynamic/sparse candidate) +template<class Range, class F, std::enable_if_t<not isTupleOrDerived<Range>(), int> = 0> void sparseRangeFor(Range&& range, F&& f) { auto it = range.begin();