Add a TransformedRangeView class
This adds a
TransformedRangeView and a helper function
This behaves like a range providing
The iterators over this range internally iterate over
the wrapped range. When dereferencing the iterator,
the value is transformed on-the-fly using a given
transformation function leaving the underlying range
The transformation may either return temorary values or l-value references. In the former case the range behaves like a proxy-container. In the latter case it forwards these references allowing, e.g., to sort a subset of some container by applying a transformation to an index-range for those values.
The iterators of the
TransformedRangeView have the same
iterator_category as the ones of the wrapped container.
If the wrapped range is an r-value, then the TransformedRangeView stores it by value, if the wrapped range is an l-value, then the TransformedRangeView stores it by reference.