|
Boost : |
From: Andrey Semashev (andysem_at_[hidden])
Date: 2008-04-01 11:58:19
Hi,
I propose to add a simple helper function to create an iterator range of
boost::transform_iterators. This would effectively create a view over a
different range or a container.
Currently this is possible to do with considerable code duplication:
make_iterator_range(
make_transform_iterator(vec.begin(), fun),
make_transform_iterator(vec.end(), fun));
Here "fun" could be a rather complex lambda or bind expression. What I
propose is to wrap these calls into a simple generator make_view. The
above code would look much better:
make_view(vec.begin(), vec.end(), fun);
or
make_view(vec, fun);
I've attached a sample implementation of the make_view function. Do you
think this could be useful?
#ifndef BOOST_RANGE_VIEW_HPP_INCLUDED_
#define BOOST_RANGE_VIEW_HPP_INCLUDED_
#include <boost/iterator/transform_iterator.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <boost/range/iterator.hpp>
namespace boost {
template< typename IteratorT, typename FunT >
inline iterator_range<
transform_iterator< FunT, IteratorT >
> make_view(IteratorT const& begin, IteratorT const& end, FunT const& fun)
{
return make_iterator_range(
make_transform_iterator(begin, fun),
make_transform_iterator(end, fun));
}
template< typename RangeT, typename FunT >
inline iterator_range<
transform_iterator<
FunT,
typename range_iterator< const RangeT >::type
>
> make_view(RangeT const& range, FunT const& fun)
{
return make_view(begin(range), end(range), fun);
}
} // namespace boost
#endif // BOOST_RANGE_VIEW_HPP_INCLUDED_
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk