15 #ifndef WIBBLE_RANGE_H 16 #define WIBBLE_RANGE_H 20 template<
typename _ >
struct Range;
21 template<
typename _ >
struct Consumer;
25 template<
typename R >
27 typedef typename R::ElementType
T;
49 typename R::ElementType
current()
const {
return *(*this); }
60 template<
typename T,
typename Self >
65 const Self &
self()
const {
return *
static_cast< const Self *
>( this ); }
71 iterator
end()
const { Self e( this->
self() ); e.setToEmpty();
return iterator( e ); }
75 Self
tail()
const { Self e( this->
self() ); e.removeFirst();
return e; }
92 template<
typename T >
94 virtual T head()
const = 0;
95 virtual void removeFirst() = 0;
96 virtual void setToEmpty() = 0;
100 template<
typename T,
typename W >
103 typedef typename W::RangeImplementation
Wrapped;
107 virtual T head()
const {
return this->wrapped().head(); }
152 template<
typename T >
153 struct Range :
Amorph< Range< T >, RangeInterface< T > >,
158 template<
typename C >
163 T head()
const {
return this->implementation()->head(); }
188 template<
typename It >
190 typename std::iterator_traits< It >::value_type,
191 IteratorRange< It > >
193 typedef typename std::iterator_traits< It >::value_type
Value;
197 : m_current( c ), m_end( e ) {}
199 Value
head()
const {
return *m_current; }
221 template<
typename T,
typename Casted >
227 return static_cast< T >( m_casted.head() );
236 m_casted.setToEmpty();
245 template<
typename T,
typename C >
251 template<
typename T,
typename C >
257 template<
typename T >
template<
typename C >
259 return castedRange< C >( *this );
263 template<
typename In >
268 template<
typename C >
270 return range( c.begin(), c.end() );
273 template<
typename T >
278 : m_first( r1 ), m_second( r2 ),
285 while ( !m_first.empty() && !m_second.empty() ) {
286 if ( m_first.head() < m_second.head() )
287 m_first.removeFirst();
288 else if ( m_second.head() < m_first.head() )
289 m_second.removeFirst();
292 if ( m_second.empty() ) m_first.setToEmpty();
293 else if ( m_first.empty() ) m_second.setToEmpty();
300 m_first.removeFirst();
301 m_second.removeFirst();
307 return m_first.head();
311 m_first.setToEmpty();
312 m_second.setToEmpty();
326 template<
typename R >
331 template<
typename R,
typename Pred >
333 FilteredRange< R, Pred > >
342 m_current = std::find_if( m_current,
m_range.end(), pred() );
369 const Pred &
pred()
const {
return m_pred; }
376 template<
typename R,
typename Pred >
382 template<
typename T >
423 template<
typename R >
428 template<
typename Transform >
430 TransformedRange< Transform > >
432 typedef typename Transform::argument_type
Source;
433 typedef typename Transform::result_type
Result;
435 :
m_range( r ), m_transform( t ) {}
450 template<
typename Trans >
456 template<
typename T,
typename _Advance,
typename _End >
464 : m_current( t ), m_advance( a ), m_endPred( e ), m_end( false )
469 m_advance( m_current );
476 T head()
const {
return m_current; }
478 bool isEnd()
const {
return m_end || m_endPred( m_current ); }
481 if ( isEnd() == r.
isEnd() && !isEnd() )
483 return isEnd() <= r.
isEnd();
493 template<
typename T,
typename A,
typename E >
virtual ~RangeInterface()
Definition: range.h:97
bool operator<=(const GeneratedRange &r) const
Definition: range.h:480
void setToEmpty()
Definition: range.h:310
void find() const
Definition: range.h:388
CastedRange(Range< Casted > r)
Definition: range.h:225
W::RangeImplementation Wrapped
Definition: range.h:103
Value head() const
Definition: range.h:199
Iterator< typename I::value_type > iterator(I i)
Definition: iterator.h:123
TransformedRange< Trans > transformedRange(Range< typename Trans::argument_type > r, Trans t)
Definition: range.h:451
bool operator<=(const IntersectionRange &f) const
Definition: range.h:315
R::ElementType operator*() const
Definition: range.h:48
Range(const C &i, typename IsType< int, typename C::RangeImplementation >::T fake=0)
Definition: range.h:159
Advance m_advance
Definition: range.h:488
R::iterator m_current
Definition: range.h:371
void setToEmpty()
Definition: range.h:357
R::ElementType ElementType
Definition: range.h:335
bool operator<=(const UniqueRange &r) const
Definition: range.h:412
const T * operator->() const
Definition: range.h:32
void find() const
Definition: range.h:283
RangeIterator()
Definition: range.h:35
~RangeMixin()
Definition: range.h:86
_T T
Definition: cast.h:26
T head() const
Definition: range.h:476
const Pred & pred() const
Definition: range.h:369
Range< typename In::value_type > range(In b, In e)
Definition: range.h:264
T head()
Definition: range.h:74
FilteredRange< R, Pred > filteredRange(R r, Pred p)
Definition: range.h:377
iterator end() const
Definition: range.h:71
_Advance Advance
Definition: range.h:459
bool m_valid
Definition: range.h:323
It m_current
Definition: range.h:211
UniqueRange< typename R::ElementType > uniqueRange(R r1)
Definition: range.h:424
void removeFirst()
Definition: range.h:200
T value_type
Definition: range.h:39
RangeIterator(const R &r)
Definition: range.h:36
T m_current
Definition: range.h:487
R m_range
Definition: range.h:56
_End End
Definition: range.h:460
Range< Casted > m_casted
Definition: range.h:240
End m_endPred
Definition: range.h:489
IntersectionRange< typename R::ElementType > intersectionRange(R r1, R r2)
Definition: range.h:327
void removeFirst()
Definition: range.h:298
bool operator<=(const FilteredRange &f) const
Definition: range.h:361
T head() const
Definition: range.h:403
const T & const_reference
Definition: range.h:43
ListIterator< List > begin(List l)
Definition: list.h:420
IntersectionRange(Range< T > r1, Range< T > r2)
Definition: range.h:277
T & reference
Definition: range.h:42
void setToEmpty()
Definition: range.h:472
bool m_valid
Definition: range.h:373
bool operator<=(const IteratorRange &r) const
Definition: range.h:202
T x
Definition: range.h:31
void output(Consumer< T > t) const
Definition: range.h:78
T ElementType
Definition: range.h:64
std::forward_iterator_tag iterator_category
Definition: range.h:38
ElementType head() const
Definition: range.h:352
T head() const
Definition: range.h:226
Range< T > m_first
Definition: range.h:322
Definition: iterator.h:57
Range< T > m_second
Definition: range.h:322
IntersectionRange()
Definition: range.h:276
FilteredRange(const R &r, Pred p)
Definition: range.h:337
Proxy operator->() const
Definition: range.h:45
iterator begin() const
Definition: range.h:70
virtual T head() const
Definition: range.h:107
virtual void removeFirst()
Definition: range.h:106
Range< T > m_range
Definition: range.h:419
R::ElementType current() const
Definition: range.h:49
GeneratedRange(const T &t, const Advance &a, const End &e)
Definition: range.h:463
void setToEmpty()
Definition: range.h:206
IteratorRange()
Definition: range.h:195
CastedRange()
Definition: range.h:224
UniqueRange()
Definition: range.h:385
Range< T > castedRange(C r)
Definition: range.h:246
bool isEnd() const
Definition: range.h:478
void removeFirst()
Definition: range.h:164
T head() const
Definition: range.h:163
void setToEmpty()
Definition: range.h:235
R::ElementType T
Definition: range.h:27
R m_range
Definition: range.h:370
bool m_end
Definition: range.h:490
Pred m_pred
Definition: range.h:372
RangeIterator operator++(int)
Definition: range.h:51
IteratorRange(It c, It e)
Definition: range.h:196
T * pointer
Definition: range.h:41
void removeFirst()
Definition: range.h:468
T head() const
Definition: range.h:305
bool m_valid
Definition: range.h:420
void removeFirst()
Definition: range.h:397
IteratorMixin< T, Self > Base
Definition: range.h:66
Range()
Definition: range.h:161
RangeIterator next() const
Definition: range.h:47
ptrdiff_t difference_type
Definition: range.h:40
virtual void setToEmpty()
Definition: range.h:105
Proxy(T _x)
Definition: range.h:30
UniqueRange(Range< T > r)
Definition: range.h:386
void removeFirst()
Definition: range.h:346
Self RangeImplementation
Definition: range.h:63
Range< T > upcastRange(C r)
Definition: range.h:252
It m_end
Definition: range.h:211
bool operator<=(const CastedRange &r) const
Definition: range.h:231
bool empty() const
Definition: range.h:82
Definition: consumer.h:17
RangeIterator< Self > iterator
Definition: range.h:67
std::iterator_traits< It >::value_type Value
Definition: range.h:193
Self tail() const
Definition: range.h:75
RangeIterator & operator++()
Definition: range.h:50
ListIterator< List > end(List)
Definition: list.h:425
Amorph< Range< T >, RangeInterface< T > > Super
Definition: range.h:156
RangeMorph(const Wrapped &w)
Definition: range.h:104
void setToEmpty()
Definition: range.h:408
bool operator<=(const RangeIterator &r) const
Definition: range.h:52
GeneratedRange()
Definition: range.h:462
void removeFirst()
Definition: range.h:229
void find() const
Definition: range.h:340
GeneratedRange< T, A, E > generatedRange(T t, A a, E e)
Definition: range.h:494
void setToEmpty()
Definition: range.h:165