Boost logo

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