3
// Copyright Thorsten Ottosen, Neil Groves 2006 - 2008. Use, modification and
4
// distribution is subject to the Boost Software License, Version
5
// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6
// http://www.boost.org/LICENSE_1_0.txt)
8
// For more information, see http://www.boost.org/libs/range/
11
#ifndef BOOST_RANGE_ADAPTOR_TRANSFORMED_HPP
12
#define BOOST_RANGE_ADAPTOR_TRANSFORMED_HPP
14
#include <mlib/range/adaptor/argument_fwd.hpp>
15
#include <boost/range/iterator_range.hpp>
16
#include <boost/iterator/transform_iterator.hpp>
20
namespace range_detail
23
template< class F, class R >
24
struct transform_range :
25
public boost::iterator_range<
26
boost::transform_iterator< F,
27
BOOST_DEDUCED_TYPENAME range_iterator<R>::type
32
typedef boost::iterator_range<
33
boost::transform_iterator< F,
34
BOOST_DEDUCED_TYPENAME range_iterator<R>::type
40
typedef F transform_fn_type;
41
typedef R source_range_type;
43
transform_range( F f, R& r )
44
: base( make_transform_iterator( boost::begin(r), f ),
45
make_transform_iterator( boost::end(r), f ) )
51
struct transform_holder : holder<T>
53
transform_holder( T r ) : holder<T>(r)
57
template< class InputRng, class UnaryFunction >
58
inline transform_range<UnaryFunction,InputRng>
59
operator|( InputRng& r,
60
const transform_holder<UnaryFunction>& f )
62
return transform_range<UnaryFunction,InputRng>( f.val, r );
65
template< class InputRng, class UnaryFunction >
66
inline transform_range<UnaryFunction, const InputRng>
67
operator|( const InputRng& r,
68
const transform_holder<UnaryFunction>& f )
70
return transform_range<UnaryFunction, const InputRng>( f.val, r );
75
using range_detail::transform_range;
81
const range_detail::forwarder<range_detail::transform_holder>
83
range_detail::forwarder<range_detail::transform_holder>();
86
template<class UnaryFunction, class InputRange>
87
inline transform_range<UnaryFunction, InputRange>
88
transform(InputRange& rng, UnaryFunction fn)
90
return transform_range<UnaryFunction, InputRange>(fn, rng);
93
template<class UnaryFunction, class InputRange>
94
inline transform_range<UnaryFunction, const InputRange>
95
transform(const InputRange& rng, UnaryFunction fn)
97
return transform_range<UnaryFunction, const InputRange>(fn, rng);