1
1
//! A deque. Untested as of yet. Likely buggy
2
+ #[ forbid( deprecated_mode) ] ;
3
+ #[ forbid( deprecated_pattern) ] ;
4
+ #[ forbid( non_camel_case_types) ] ;
2
5
3
6
use option:: { Some , None } ;
4
7
use dvec:: DVec ;
8
+ use core:: cmp:: { Eq } ;
5
9
6
10
trait Deque < T > {
7
11
fn size ( ) -> uint ;
@@ -24,8 +28,9 @@ fn create<T: Copy>() -> Deque<T> {
24
28
* Grow is only called on full elts, so nelts is also len(elts), unlike
25
29
* elsewhere.
26
30
*/
27
- fn grow < T : Copy > ( nelts : uint , lo : uint , -elts : ~[ mut Cell < T > ] ) ->
28
- ~[ mut Cell < T > ] {
31
+ fn grow < T : Copy > ( nelts : uint , lo : uint , +elts : ~[ mut Cell < T > ] )
32
+ -> ~[ mut Cell < T > ] {
33
+ let elts = move elts;
29
34
assert ( nelts == vec:: len ( elts) ) ;
30
35
let mut rv = ~[ mut] ;
31
36
@@ -40,8 +45,8 @@ fn create<T: Copy>() -> Deque<T> {
40
45
41
46
move rv
42
47
}
43
- fn get < T : Copy > ( elts : DVec < Cell < T > > , i : uint ) -> T {
44
- match elts. get_elt ( i) { Some ( t) => t, _ => fail }
48
+ fn get < T : Copy > ( elts : & DVec < Cell < T > > , i : uint ) -> T {
49
+ match ( * elts) . get_elt ( i) { Some ( t) => t, _ => fail }
45
50
}
46
51
47
52
type Repr < T > = { mut nelts : uint ,
@@ -79,7 +84,7 @@ fn create<T: Copy>() -> Deque<T> {
79
84
* that we don't keep anyone's refcount up unexpectedly.
80
85
*/
81
86
fn pop_front ( ) -> T {
82
- let t: T = get ( self . elts , self . lo ) ;
87
+ let t: T = get ( & self . elts , self . lo ) ;
83
88
self . elts . set_elt ( self . lo , None ) ;
84
89
self . lo = ( self . lo + 1 u) % self . elts . len ( ) ;
85
90
self . nelts -= 1 u;
@@ -89,16 +94,16 @@ fn create<T: Copy>() -> Deque<T> {
89
94
if self . hi == 0 u {
90
95
self . hi = self . elts . len ( ) - 1 u;
91
96
} else { self . hi -= 1 u; }
92
- let t: T = get ( self . elts , self . hi ) ;
97
+ let t: T = get ( & self . elts , self . hi ) ;
93
98
self . elts . set_elt ( self . hi , None ) ;
94
99
self . nelts -= 1 u;
95
100
return t;
96
101
}
97
- fn peek_front ( ) -> T { return get ( self . elts , self . lo ) ; }
98
- fn peek_back ( ) -> T { return get ( self . elts , self . hi - 1 u) ; }
102
+ fn peek_front ( ) -> T { return get ( & self . elts , self . lo ) ; }
103
+ fn peek_back ( ) -> T { return get ( & self . elts , self . hi - 1 u) ; }
99
104
fn get ( i : int ) -> T {
100
105
let idx = ( self . lo + ( i as uint ) ) % self . elts . len ( ) ;
101
- return get ( self . elts , idx) ;
106
+ return get ( & self . elts , idx) ;
102
107
}
103
108
}
104
109
@@ -160,7 +165,13 @@ mod tests {
160
165
assert ( d. get ( 3 ) == 4 ) ;
161
166
}
162
167
163
- fn test_boxes ( a : @int , b : @int , c : @int , d : @int ) {
168
+ #[ test]
169
+ fn test_boxes ( ) {
170
+ let a: @int = @5 ;
171
+ let b: @int = @72 ;
172
+ let c: @int = @64 ;
173
+ let d: @int = @175 ;
174
+
164
175
let deq: deque:: Deque < @int > = deque:: create :: < @int > ( ) ;
165
176
assert ( deq. size ( ) == 0 u) ;
166
177
deq. add_front ( a) ;
@@ -190,11 +201,7 @@ mod tests {
190
201
assert ( deq. get ( 3 ) == d) ;
191
202
}
192
203
193
- type EqFn < T > = fn @( T , T ) -> bool ;
194
-
195
- fn test_parameterized < T : Copy Owned > (
196
- e : EqFn < T > , a : T , b : T , c : T , d : T ) {
197
-
204
+ fn test_parameterized < T : Copy Eq Owned > ( +a : T , +b : T , +c : T , +d : T ) {
198
205
let deq: deque:: Deque < T > = deque:: create :: < T > ( ) ;
199
206
assert ( deq. size ( ) == 0 u) ;
200
207
deq. add_front ( a) ;
@@ -203,12 +210,12 @@ mod tests {
203
210
assert ( deq. size ( ) == 3 u) ;
204
211
deq. add_back ( d) ;
205
212
assert ( deq. size ( ) == 4 u) ;
206
- assert ( e ( deq. peek_front ( ) , b ) ) ;
207
- assert ( e ( deq. peek_back ( ) , d ) ) ;
208
- assert ( e ( deq. pop_front ( ) , b ) ) ;
209
- assert ( e ( deq. pop_back ( ) , d ) ) ;
210
- assert ( e ( deq. pop_back ( ) , c ) ) ;
211
- assert ( e ( deq. pop_back ( ) , a ) ) ;
213
+ assert deq. peek_front ( ) == b ;
214
+ assert deq. peek_back ( ) == d ;
215
+ assert deq. pop_front ( ) == b ;
216
+ assert deq. pop_back ( ) == d ;
217
+ assert deq. pop_back ( ) == c ;
218
+ assert deq. pop_back ( ) == a ;
212
219
assert ( deq. size ( ) == 0 u) ;
213
220
deq. add_back ( c) ;
214
221
assert ( deq. size ( ) == 1 u) ;
@@ -218,10 +225,10 @@ mod tests {
218
225
assert ( deq. size ( ) == 3 u) ;
219
226
deq. add_front ( a) ;
220
227
assert ( deq. size ( ) == 4 u) ;
221
- assert ( e ( deq. get ( 0 ) , a ) ) ;
222
- assert ( e ( deq. get ( 1 ) , b ) ) ;
223
- assert ( e ( deq. get ( 2 ) , c ) ) ;
224
- assert ( e ( deq. get ( 3 ) , d ) ) ;
228
+ assert deq. get ( 0 ) == a ;
229
+ assert deq. get ( 1 ) == b ;
230
+ assert deq. get ( 2 ) == c ;
231
+ assert deq. get ( 3 ) == d ;
225
232
}
226
233
227
234
enum Taggy { One ( int ) , Two ( int , int ) , Three ( int , int , int ) , }
@@ -232,78 +239,86 @@ mod tests {
232
239
233
240
type RecCy = { x : int , y : int , t : Taggy } ;
234
241
235
- #[ test]
236
- fn test ( ) {
237
- fn inteq ( & & a: int , & & b: int ) -> bool { return a == b; }
238
- fn intboxeq ( & & a: @int , & & b: @int ) -> bool { return a == b; }
239
- fn taggyeq ( a : Taggy , b : Taggy ) -> bool {
240
- match a {
241
- One ( a1) => match b {
242
+ impl Taggy : Eq {
243
+ pure fn eq ( other : Taggy ) -> bool {
244
+ match self {
245
+ One ( a1) => match other {
242
246
One ( b1) => return a1 == b1,
243
247
_ => return false
244
248
} ,
245
- Two ( a1, a2) => match b {
249
+ Two ( a1, a2) => match other {
246
250
Two ( b1, b2) => return a1 == b1 && a2 == b2,
247
251
_ => return false
248
252
} ,
249
- Three ( a1, a2, a3) => match b {
253
+ Three ( a1, a2, a3) => match other {
250
254
Three ( b1, b2, b3) => return a1 == b1 && a2 == b2 && a3 == b3,
251
255
_ => return false
252
256
}
253
257
}
254
258
}
255
- fn taggypareq < T > ( a : Taggypar < T > , b : Taggypar < T > ) -> bool {
256
- match a {
257
- Onepar :: < T > ( a1) => match b {
258
- Onepar :: < T > ( b1) => return a1 == b1,
259
- _ => return false
260
- } ,
261
- Twopar :: < T > ( a1, a2) => match b {
262
- Twopar :: < T > ( b1, b2) => return a1 == b1 && a2 == b2,
263
- _ => return false
264
- } ,
265
- Threepar :: < T > ( a1, a2, a3) => match b {
266
- Threepar :: < T > ( b1, b2, b3) => {
267
- return a1 == b1 && a2 == b2 && a3 == b3
268
- }
269
- _ => return false
270
- }
271
- }
259
+ pure fn ne ( other : Taggy ) -> bool { !self . eq ( other) }
260
+ }
261
+
262
+ impl Taggypar < int > : Eq {
263
+ //let eq4: EqFn<Taggypar<int>> = |x,y| taggypareq::<int>(x, y);
264
+ pure fn eq ( other : Taggypar < int > ) -> bool {
265
+ match self {
266
+ Onepar :: < int > ( a1) => match other {
267
+ Onepar :: < int > ( b1) => return a1 == b1,
268
+ _ => return false
269
+ } ,
270
+ Twopar :: < int > ( a1, a2) => match other {
271
+ Twopar :: < int > ( b1, b2) => return a1 == b1 && a2 == b2,
272
+ _ => return false
273
+ } ,
274
+ Threepar :: < int > ( a1, a2, a3) => match other {
275
+ Threepar :: < int > ( b1, b2, b3) => {
276
+ return a1 == b1 && a2 == b2 && a3 == b3
277
+ }
278
+ _ => return false
279
+ }
280
+ }
272
281
}
273
- fn reccyeq ( a : RecCy , b : RecCy ) -> bool {
274
- return a. x == b. x && a. y == b. y && taggyeq ( a. t , b. t ) ;
282
+ pure fn ne ( other : Taggypar < int > ) -> bool { !self . eq ( other) }
283
+ }
284
+
285
+ impl RecCy : Eq {
286
+ pure fn eq ( other : RecCy ) -> bool {
287
+ return self . x == other. x && self . y == other. y && self . t == other. t ;
275
288
}
276
- debug ! ( "*** test boxes" ) ;
277
- test_boxes ( @5 , @72 , @64 , @175 ) ;
278
- debug ! ( "*** end test boxes" ) ;
279
- debug ! ( "test parameterized: int" ) ;
280
- let eq1: EqFn < int > = inteq;
281
- test_parameterized :: < int > ( eq1, 5 , 72 , 64 , 175 ) ;
282
- debug ! ( "*** test parameterized: @int" ) ;
283
- let eq2: EqFn < @int > = intboxeq;
284
- test_parameterized :: < @int > ( eq2, @5 , @72 , @64 , @175 ) ;
285
- debug ! ( "*** end test parameterized @int" ) ;
286
- debug ! ( "test parameterized: taggy" ) ;
287
- let eq3: EqFn < Taggy > = taggyeq;
288
- test_parameterized :: < Taggy > ( eq3, One ( 1 ) , Two ( 1 , 2 ) , Three ( 1 , 2 , 3 ) ,
289
+ pure fn ne ( other : RecCy ) -> bool { !self . eq ( other) }
290
+ }
291
+
292
+ #[ test]
293
+ fn test_param_int ( ) {
294
+ test_parameterized :: < int > ( 5 , 72 , 64 , 175 ) ;
295
+ }
296
+
297
+ #[ test]
298
+ fn test_param_at_int ( ) {
299
+ test_parameterized :: < @int > ( @5 , @72 , @64 , @175 ) ;
300
+ }
301
+
302
+ #[ test]
303
+ fn test_param_taggy ( ) {
304
+ test_parameterized :: < Taggy > ( One ( 1 ) , Two ( 1 , 2 ) , Three ( 1 , 2 , 3 ) ,
289
305
Two ( 17 , 42 ) ) ;
306
+ }
290
307
291
- debug ! ( "*** test parameterized: taggypar<int>" ) ;
292
- let eq4 : EqFn < Taggypar < int > > = |x , y| taggypareq :: < int > ( x , y ) ;
293
- test_parameterized :: < Taggypar < int > > ( eq4 , Onepar :: < int > ( 1 ) ,
308
+ # [ test]
309
+ fn test_param_taggypar ( ) {
310
+ test_parameterized :: < Taggypar < int > > ( Onepar :: < int > ( 1 ) ,
294
311
Twopar :: < int > ( 1 , 2 ) ,
295
312
Threepar :: < int > ( 1 , 2 , 3 ) ,
296
313
Twopar :: < int > ( 17 , 42 ) ) ;
297
- debug ! ( "*** end test parameterized: taggypar::<int>" ) ;
314
+ }
298
315
299
- debug ! ( "*** test parameterized: reccy" ) ;
316
+ #[ test]
317
+ fn test_param_reccy ( ) {
300
318
let reccy1: RecCy = { x: 1 , y: 2 , t: One ( 1 ) } ;
301
319
let reccy2: RecCy = { x: 345 , y: 2 , t: Two ( 1 , 2 ) } ;
302
320
let reccy3: RecCy = { x: 1 , y: 777 , t: Three ( 1 , 2 , 3 ) } ;
303
321
let reccy4: RecCy = { x: 19 , y: 252 , t: Two ( 17 , 42 ) } ;
304
- let eq5: EqFn < RecCy > = reccyeq;
305
- test_parameterized :: < RecCy > ( eq5, reccy1, reccy2, reccy3, reccy4) ;
306
- debug ! ( "*** end test parameterized: reccy" ) ;
307
- debug ! ( "*** done" ) ;
322
+ test_parameterized :: < RecCy > ( reccy1, reccy2, reccy3, reccy4) ;
308
323
}
309
324
}
0 commit comments