11 #include <ext/algorithm>
16 #ifndef WIBBLE_RANGE_H
17 #define WIBBLE_RANGE_H
21 template<
typename _ >
struct Range;
22 template<
typename _ >
struct Consumer;
26 template<
typename R >
28 typedef typename R::ElementType
T;
50 typename R::ElementType
current()
const {
return *(*this); }
61 template<
typename T,
typename Self >
66 const Self &
self()
const {
return *
static_cast< const Self *
>( this ); }
76 Self
tail()
const { Self e( this->
self() ); e.removeFirst();
return e; }
93 template<
typename T >
95 virtual T
head()
const = 0;
101 template<
typename T,
typename W >
104 typedef typename W::RangeImplementation
Wrapped;
153 template<
typename T >
154 struct Range : Amorph< Range< T >, RangeInterface< T > >,
155 RangeMixin< T, Range< T > >
159 template<
typename C >
189 template<
typename It >
191 typename std::iterator_traits< It >::value_type,
192 IteratorRange< It > >
194 typedef typename std::iterator_traits< It >::value_type
Value;
222 template<
typename T,
typename Casted >
246 template<
typename T,
typename C >
252 template<
typename T,
typename C >
258 template<
typename T >
template<
typename C >
260 return castedRange< C >( *this );
264 template<
typename In >
269 template<
typename C >
271 return range( c.begin(), c.end() );
274 template<
typename T >
327 template<
typename R >
332 template<
typename R,
typename Pred >
334 FilteredRange< R, Pred > >
377 template<
typename R,
typename Pred >
383 template<
typename T >
424 template<
typename R >
429 template<
typename Transform >
431 TransformedRange< Transform > >
433 typedef typename Transform::argument_type
Source;
434 typedef typename Transform::result_type
Result;
451 template<
typename Trans >
457 template<
typename T,
typename _Advance,
typename _End >
494 template<
typename T,
typename A,
typename E >