Boost logo

Boost :

From: Andrey Semashev (andysem_at_[hidden])
Date: 2008-04-01 11:58:19


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_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);


   make_view(vec, fun);

I've attached a sample implementation of the make_view function. Do you
think this could be useful?


#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<
        typename range_iterator< const RangeT >::type
> make_view(RangeT const& range, FunT const& fun)
    return make_view(begin(range), end(range), fun);

} // namespace boost


Boost list run by bdawes at, gregod at, cpdaniel at, john at