wibble  1.1
range.test.h
Go to the documentation of this file.
1 // -*- C++ -*- (c) 2005, 2006, 2007 Petr Rockai <me@mornfall.net>
2 
3 #include <wibble/range.h>
4 #include <wibble/operators.h>
5 #include <list>
6 #include <functional>
7 
8 namespace {
9 
10 using namespace wibble;
11 using namespace operators;
12 
13 struct TestRange {
14 
15  Test iteratorRange() {
16  std::list<int> a;
17  a.push_back( 10 );
18  a.push_back( 20 );
19  Range< int > r = range( a.begin(), a.end() );
21  assert_eq( *i, 10 );
22  assert_eq( *(i + 1), 20 );
23  assert( i + 2 == r.end() );
24  }
25 
26  Test copy() {
27  std::list<int> a;
28  a.push_back( 10 );
29  a.push_back( 20 );
30  Range< int > r = range( a.begin(), a.end() );
31  std::list<int> b;
32  assert( a != b );
33  std::copy( r.begin(), r.end(), back_inserter( b ) );
34  assert( a == b );
35  }
36 
37  Test copyToConsumer() {
38  // std::vector< int > &vec = *new (GC) std::vector< int >;
39  std::vector< int > vec;
40  std::list< int > a;
41  a.push_back( 10 );
42  a.push_back( 20 );
43  Range< int > r = range( a.begin(), a.end() );
44  std::copy( r.begin(), r.end(), consumer( vec ) );
45  Range< int > r1 = range( vec );
46  assert_eq( *r1.begin(), 10 );
47  assert_eq( *(r1.begin() + 1), 20 );
48  assert( r1.begin() + 2 == r1.end() );
49  while ( !r.empty() ) {
50  assert_eq( r.head(), r1.head() );
51  r = r.tail();
52  r1 = r1.tail();
53  }
54  assert( r1.empty() );
55  }
56 
57  Test _filteredRange() {
58  std::vector< int > v;
59  std::list<int> a;
60  a.push_back( 10 );
61  a.push_back( 20 );
62  Range< int > r = range( a.begin(), a.end() );
63  r.output( consumer( v ) );
64 
65  Range<int> fr =
66  filteredRange( range( v ),
67  std::bind1st( std::equal_to< int >(), 10 ) );
68  assert_eq( fr.head(), 10 );
69  fr = fr.tail();
70  assert( fr.empty() );
71  }
72 
73  Test sort() {
74  std::vector< int > v;
75  std::list<int> a;
76  a.push_back( 20 );
77  a.push_back( 10 );
78  a.push_back( 30 );
79  Range< int > r = range( a.begin(), a.end() );
80  r.output( consumer( v ) );
81  std::sort( v.begin(), v.end() );
82  assert_eq( *(v.begin()), 10 );
83  assert_eq( *(v.begin() + 1), 20 );
84  assert_eq( *(v.begin() + 2), 30 );
85  assert( v.begin() + 3 == v.end() );
86  }
87 
88  Test assignment() {
89  std::vector< int > vec;
90  Range< int > a;
91  a = range( vec );
92  assert( a.empty() );
93  vec.push_back( 4 );
94  Range< int > b = range( vec );
95  assert_eq( b.head(), 4 );
96  a = b;
97  assert( !a.empty() );
98  assert_eq( a.head(), 4 );
99  }
100 
101  Test _transformedRange() {
102  Range< int > a;
103  std::vector< int > xv;
104  Consumer< int > x = consumer( xv );
105  x.consume( 4 );
106  x.consume( 8 );
107  a = transformedRange( range( xv ),
108  std::bind1st( std::plus< int >(), 2 ) );
109  assert_eq( a.head(), 6 );
110  a.removeFirst();
111  assert_eq( a.head(), 10 );
112  a.removeFirst();
113  assert( a.empty() );
114  }
115 
116  Test _transformedRange2() {
117  Range< int > a;
118  std::vector< unsigned > xv;
119  Consumer< unsigned > x = consumer( xv );
120  x.consume( 4 );
121  x.consume( 8 );
122  a = transformedRange(
123  range( xv ), std::bind1st( std::plus< int >(), 2 ) );
124  assert_eq( a.head(), 6 );
125  a.removeFirst();
126  assert_eq( a.head(), 10 );
127  a.removeFirst();
128  assert( a.empty() );
129  }
130 
131  Test tailOfIteratorRange() {
132  std::vector<int> a;
133  a.insert( a.begin(), 30 );
134  a.insert( a.begin(), 10 );
135  a.insert( a.begin(), 20 );
136  Range< int > r = range( a.begin(), a.end() );
137  assert_eq( r.head(), 20 );
138  r = r.tail();
139  assert_eq( r.head(), 10 );
140  r = r.tail();
141  assert_eq( r.head(), 30 );
142  r = r.tail();
143  assert( r.empty() );
144  }
145 
146  Test _castedRange()
147  {
148  std::vector<int> a;
149  a.insert( a.begin(), 30 );
150  a.insert( a.begin(), 10 );
151  a.insert( a.begin(), 20 );
152  Range< unsigned > r = castedRange< unsigned >(
153  range( a.begin(), a.end() ) );
154  assert_eq( r.head(), 20u );
155  r = r.tail();
156  assert_eq( r.head(), 10u );
157  r = r.tail();
158  assert_eq( r.head(), 30u );
159  r = r.tail();
160  assert( r.empty() );
161  }
162 
163  static void removeFirst( int &i ) {
164  ++i;
165  }
166 
167  static bool isEnd( const int &i ) {
168  return i >= 5;
169  }
170 
171  Test _generatedRange() {
172  Range< int > r = generatedRange( 0, removeFirst, isEnd );
173  assert( !r.empty() );
174  assert_eq( *(r.begin() + 0), 0 );
175  assert_eq( *(r.begin() + 1), 1 );
176  assert_eq( *(r.begin() + 2), 2 );
177  assert_eq( *(r.begin() + 3), 3 );
178  assert_eq( *(r.begin() + 4), 4 );
179  assert( (r.begin() + 5) == r.end() );
180  }
181 
182 };
183 
184 }
TransformedRange< Trans > transformedRange(Range< typename Trans::argument_type > r, Trans t)
Definition: range.h:451
void consume(const T &a)
Definition: consumer.h:78
Range< typename In::value_type > range(In b, In e)
Definition: range.h:264
FilteredRange< R, Pred > filteredRange(R r, Pred p)
Definition: range.h:377
iterator end() const
Definition: range.h:71
void Test
Definition: test.h:178
Consumer< typename Out::container_type::value_type > consumer(Out out)
Definition: consumer.h:108
#define assert_eq(x, y)
Definition: test.h:33
#define assert(x)
Definition: test.h:30
void output(Consumer< T > t) const
Definition: range.h:78
-*- C++ -*-
iterator begin() const
Definition: range.h:70
void removeFirst()
Definition: range.h:164
T head() const
Definition: range.h:163
Definition: amorph.h:17
Definition: range.h:20
bool empty() const
Definition: range.h:82
Definition: consumer.h:17
Sorted< List > sort(List l)
Definition: list.h:387
Range< T > tail() const
Definition: range.h:75
GeneratedRange< T, A, E > generatedRange(T t, A a, E e)
Definition: range.h:494