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
8namespace {
9
10using namespace wibble;
11using namespace operators;
12
13struct TestRange {
14
16 std::list<int> a;
17 a.push_back( 10 );
18 a.push_back( 20 );
19 Range< int > r = range( a.begin(), a.end() );
20 Range< int >::iterator i = r.begin();
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
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
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
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
89 std::vector< int > vec;
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
103 std::vector< int > xv;
105 x.consume( 4 );
106 x.consume( 8 );
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
118 std::vector< unsigned > xv;
120 x.consume( 4 );
121 x.consume( 8 );
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
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
147 {
148 std::vector<int> a;
149 a.insert( a.begin(), 30 );
150 a.insert( a.begin(), 10 );
151 a.insert( a.begin(), 20 );
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
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}
Sorted< List > sort(List l)
Definition list.h:387
Definition amorph.h:17
Range< typename In::value_type > range(In b, In e)
Definition range.h:264
GeneratedRange< T, A, E > generatedRange(T t, A a, E e)
Definition range.h:494
TransformedRange< Trans > transformedRange(Range< typename Trans::argument_type > r, Trans t)
Definition range.h:451
FilteredRange< R, Pred > filteredRange(R r, Pred p)
Definition range.h:377
Consumer< typename Out::container_type::value_type > consumer(Out out)
Definition consumer.h:108
-*- C++ -*-
Definition range.h:155
Definition amorph.h:30
#define assert_eq(x, y)
Definition test.h:33
#define assert(x)
Definition test.h:30