![]() |
Home | Libraries | People | FAQ | More |
To implement a Range Adaptor without arguments (e.g. reversed) you need to:
#include <boost/range/iterator_range.hpp> #include <boost/iterator/reverse_iterator.hpp> template< typename R > struct reverse_range : boost::iterator_range< boost::reverse_iterator< typename boost::range_iterator<R>::type> > { private: typedef boost::iterator_range< boost::reverse_iterator< typename boost::range_iterator<R>::type> > base; public: typedef boost::reverse_iterator< typename boost::range_iterator<R>::type > iterator; reverse_range(R& r) : base(iterator(boost::end(r)), iterator(boost::begin(r))) { } };
operator|
function overload set
namespace detail { struct reverse_forwarder {}; }
operator|
template< class BidirectionalRng > inline reverse_range<BidirectionalRng> operator|( BidirectionalRng& r, detail::reverse_forwarder ) { return reverse_range<BidirectionalRng>( r ); } template< class BidirectionalRng > inline reverse_range<const BidirectionalRng> operator|( const BidirectionalRng& r, detail::reverse_forwarder ) { return reverse_range<const BidirectionalRng>( r ); }
namespace { const detail::reverse_forwarder reversed = detail::reverse_forwarder(); }