Introduce hybrid utilities for homogeneous and heterogeneous containers
These utilities are hybrid in the sense that they work
- classical and heterogeneous containers
- dynamical intergers and
integral_constants
As a rule of thumb, size and indices are encoded as integral_constant if possible. This allows to write code like
forEach(integralRange(size(v)), [&](auto i){
elementAt(v, i) = i+1;
});
which will e.g. work for std::vector, Dune::BlockVector
but also std::tuple and Dune::MultiTypeBlockVector.
Another feature is ifElse which provides a hybrid conditional.
If passed std::true_type or std::false_type instead of bool
this emulates a static_if.