Allow iterator based transformations in TransformedRangeView
This extends TransformedRangeView
by also allowing
to apply a transformation to the iterator directly.
While the (existing) default mechanism is to use f(*it)
where f
is the transformation and it
an
iterator of the wrapped range, the new iterator
based transformation uses f(it)
instead. This
allows to incorporate additional information
from the iterator in the transformation.
Using the new functionality one can e.g. easily implement structured bindings support for sparse ranges using
template<class Range>
auto sparseRange(Range&& range) {
return Dune::transformedRangeView(std::forward<Range>(range), Dune::taggedCallback<Dune::IteratorTransformationTag>([](auto&& it) {
return std::tuple<decltype(*it), decltype(it.index())>(*it, it.index());
}));
}
...
for(auto&& [entry,col] : sparseRange(matrix[row]))
y[row] += entry*x[col];
Some more implementation details:
- This adds the
TaggedCallback<Tag,F>
helper class and the corresponding generator functiontaggedCallback<Tag>(f)
for tagging a callback. Using this mechanism we can provide additional information on the callback. - If the
TransformedRangeView
is provided with a callback of typeTaggedCallback<IteratorTransformation,F>
, then it iterator based transformation is used.