1
- // Copyright 2012 The Rust Project Developers. See the COPYRIGHT
1
+ // Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
2
2
// file at the top-level directory of this distribution and at
3
3
// http://rust-lang.org/COPYRIGHT.
4
4
//
8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- //! A deque. Untested as of yet. Likely buggy
12
- #[ forbid( non_camel_case_types) ] ;
13
-
11
+ use core:: container:: { Container , Mutable } ;
14
12
use core:: cmp:: Eq ;
15
- use core:: dvec:: DVec ;
16
- use core:: dvec;
17
13
use core:: prelude:: * ;
18
14
use core:: uint;
19
15
use core:: vec;
20
16
21
- pub trait Deque < T > {
22
- fn size ( ) -> uint ;
23
- fn add_front ( v : T ) ;
24
- fn add_back ( v : T ) ;
25
- fn pop_front ( ) -> T ;
26
- fn pop_back ( ) -> T ;
27
- fn peek_front ( ) -> T ;
28
- fn peek_back ( ) -> T ;
29
- fn get ( int ) -> T ;
17
+ const initial_capacity: uint = 32 u; // 2^5
18
+
19
+ pub struct Deque < T > {
20
+ priv nelts : uint ,
21
+ priv lo: uint ,
22
+ priv hi: uint ,
23
+ priv elts : ~[ Option < T > ]
30
24
}
31
25
32
- // FIXME (#2343) eventually, a proper datatype plus an exported impl would
33
- // be preferrable.
34
- pub fn create < T : Copy > ( ) -> Deque < T > {
35
- type Cell < T > = Option < T > ;
26
+ impl < T > Container for Deque < T > {
27
+ pure fn len ( & self ) -> uint { self . nelts }
28
+ pure fn is_empty ( & self ) -> bool { self . len ( ) == 0 }
29
+ }
36
30
37
- let initial_capacity: uint = 32 u; // 2^5
38
- /**
39
- * Grow is only called on full elts, so nelts is also len(elts), unlike
40
- * elsewhere.
41
- */
42
- fn grow < T : Copy > ( nelts : uint , lo : uint , elts : ~[ Cell < T > ] )
43
- -> ~[ Cell < T > ] {
44
- let mut elts = elts;
45
- assert ( nelts == vec:: len ( elts) ) ;
46
- let mut rv = ~[ ] ;
31
+ impl < T : Copy > Deque < T > {
32
+ static pure fn new( ) -> Deque <T > {
33
+ Deque { nelts: 0 , lo: 0 , hi: 0 ,
34
+ elts: vec:: from_fn( initial_capacity, |_| None ) }
35
+ }
47
36
48
- let mut i = 0 u;
49
- let nalloc = uint:: next_power_of_two ( nelts + 1 u) ;
50
- while i < nalloc {
51
- if i < nelts {
52
- rv. push ( elts[ ( lo + i) % nelts] ) ;
53
- } else { rv. push ( None ) ; }
54
- i += 1 u;
37
+ fn add_front ( & mut self , t : T ) {
38
+ let oldlo: uint = self . lo ;
39
+ if self . lo == 0 u {
40
+ self . lo = self . elts . len ( ) - 1 u;
41
+ } else { self . lo -= 1 u; }
42
+ if self . lo == self . hi {
43
+ self . elts = grow ( self . nelts , oldlo, self . elts ) ;
44
+ self . lo = self . elts . len ( ) - 1 u;
45
+ self . hi = self . nelts ;
55
46
}
47
+ self . elts [ self . lo ] = Some ( t) ;
48
+ self . nelts += 1 u;
49
+ }
56
50
57
- rv
51
+ fn add_back ( & mut self , t : T ) {
52
+ if self . lo == self . hi && self . nelts != 0 u {
53
+ self . elts = grow ( self . nelts , self . lo , self . elts ) ;
54
+ self . lo = 0 u;
55
+ self . hi = self . nelts ;
56
+ }
57
+ self . elts [ self . hi ] = Some ( t) ;
58
+ self . hi = ( self . hi + 1 u) % self . elts . len ( ) ;
59
+ self . nelts += 1 u;
58
60
}
59
- fn get < T : Copy > ( elts : & DVec < Cell < T > > , i : uint ) -> T {
60
- match ( * elts) . get_elt ( i) { Some ( t) => t, _ => fail ! ( ) }
61
+
62
+ fn pop_front ( & mut self ) -> T {
63
+ let t: T = get ( self . elts , self . lo ) ;
64
+ self . elts [ self . lo ] = None ;
65
+ self . lo = ( self . lo + 1 u) % self . elts . len ( ) ;
66
+ self . nelts -= 1 u;
67
+ return t;
61
68
}
62
69
63
- struct Repr < T > {
64
- mut nelts : uint ,
65
- mut lo: uint ,
66
- mut hi: uint ,
67
- elts : DVec < Cell < T > > ,
70
+ fn pop_back ( & mut self ) -> T {
71
+ if self . hi == 0 u {
72
+ self . hi = self . elts . len ( ) - 1 u;
73
+ } else { self . hi -= 1 u; }
74
+ let t: T = get ( self . elts , self . hi ) ;
75
+ self . elts [ self . hi ] = None ;
76
+ self . nelts -= 1 u;
77
+ return t;
68
78
}
69
79
70
- impl < T : Copy > Deque < T > for Repr < T > {
71
- fn size ( ) -> uint { return self . nelts ; }
72
- fn add_front ( t : T ) {
73
- let oldlo: uint = self . lo ;
74
- if self . lo == 0 u {
75
- self . lo = self . elts . len ( ) - 1 u;
76
- } else { self . lo -= 1 u; }
77
- if self . lo == self . hi {
78
- self . elts . swap ( |v| grow ( self . nelts , oldlo, v) ) ;
79
- self . lo = self . elts . len ( ) - 1 u;
80
- self . hi = self . nelts ;
81
- }
82
- self . elts . set_elt ( self . lo , Some ( t) ) ;
83
- self . nelts += 1 u;
84
- }
85
- fn add_back ( t : T ) {
86
- if self . lo == self . hi && self . nelts != 0 u {
87
- self . elts . swap ( |v| grow ( self . nelts , self . lo , v) ) ;
88
- self . lo = 0 u;
89
- self . hi = self . nelts ;
90
- }
91
- self . elts . set_elt ( self . hi , Some ( t) ) ;
92
- self . hi = ( self . hi + 1 u) % self . elts . len ( ) ;
93
- self . nelts += 1 u;
94
- }
95
- /**
96
- * We actually release (turn to none()) the T we're popping so
97
- * that we don't keep anyone's refcount up unexpectedly.
98
- */
99
- fn pop_front ( ) -> T {
100
- let t: T = get ( & self . elts , self . lo ) ;
101
- self . elts . set_elt ( self . lo , None ) ;
102
- self . lo = ( self . lo + 1 u) % self . elts . len ( ) ;
103
- self . nelts -= 1 u;
104
- return t;
105
- }
106
- fn pop_back ( ) -> T {
107
- if self . hi == 0 u {
108
- self . hi = self . elts . len ( ) - 1 u;
109
- } else { self . hi -= 1 u; }
110
- let t: T = get ( & self . elts , self . hi ) ;
111
- self . elts . set_elt ( self . hi , None ) ;
112
- self . nelts -= 1 u;
113
- return t;
114
- }
115
- fn peek_front ( ) -> T { return get ( & self . elts , self . lo ) ; }
116
- fn peek_back ( ) -> T { return get ( & self . elts , self . hi - 1 u) ; }
117
- fn get ( i : int ) -> T {
118
- let idx = ( self . lo + ( i as uint ) ) % self . elts . len ( ) ;
119
- return get ( & self . elts , idx) ;
120
- }
80
+ fn peek_front ( & self ) -> T { return get ( self . elts , self . lo ) ; }
81
+
82
+ fn peek_back ( & self ) -> T { return get ( self . elts , self . hi - 1 u) ; }
83
+
84
+ fn get ( & self , i : int ) -> T {
85
+ let idx = ( self . lo + ( i as uint ) ) % self . elts . len ( ) ;
86
+ return get ( self . elts , idx) ;
87
+ }
88
+ }
89
+
90
+ /// Grow is only called on full elts, so nelts is also len(elts), unlike
91
+ /// elsewhere.
92
+ fn grow <T : Copy >( nelts: uint, lo: uint, elts: & [ Option <T >] ) -> ~[ Option <T >] {
93
+ assert nelts == elts. len ( ) ;
94
+ let mut rv = ~[ ] ;
95
+
96
+ let mut i = 0 u;
97
+ let nalloc = uint:: next_power_of_two ( nelts + 1 u) ;
98
+ while i < nalloc {
99
+ if i < nelts {
100
+ rv. push ( elts[ ( lo + i) % nelts] ) ;
101
+ } else { rv. push ( None ) ; }
102
+ i += 1 u;
121
103
}
122
104
123
- let repr: Repr < T > = Repr {
124
- nelts : 0 u,
125
- lo : 0 u,
126
- hi : 0 u,
127
- elts : dvec:: from_vec ( vec:: from_elem ( initial_capacity, None ) ) ,
128
- } ;
105
+ rv
106
+ }
129
107
130
- repr as Deque :: < T >
108
+ fn get<T : Copy >( elts: & [ Option <T >] , i: uint) -> T {
109
+ match elts[ i] { Some ( t) => t, _ => fail ! ( ) }
131
110
}
132
111
133
112
#[ cfg( test) ]
134
113
mod tests {
135
114
use core:: prelude: : * ;
136
-
137
- use deque:: * ;
138
- use deque;
115
+ use super :: * ;
139
116
140
117
#[ test]
141
118
fn test_simple( ) {
142
- let d : deque :: Deque < int > = deque :: create :: < int > ( ) ;
143
- assert ( d. size ( ) == 0 u) ;
119
+ let mut d = Deque : : new ( ) ;
120
+ assert ( d. len ( ) == 0 u) ;
144
121
d. add_front ( 17 ) ;
145
122
d. add_front ( 42 ) ;
146
123
d. add_back ( 137 ) ;
147
- assert ( d. size ( ) == 3 u) ;
124
+ assert ( d. len ( ) == 3 u) ;
148
125
d. add_back ( 137 ) ;
149
- assert ( d. size ( ) == 4 u) ;
126
+ assert ( d. len ( ) == 4 u) ;
150
127
log ( debug, d. peek_front ( ) ) ;
151
128
assert ( d. peek_front ( ) == 42 ) ;
152
129
log ( debug, d. peek_back ( ) ) ;
@@ -163,15 +140,15 @@ mod tests {
163
140
i = d. pop_back ( ) ;
164
141
log ( debug, i) ;
165
142
assert ( i == 17 ) ;
166
- assert ( d. size ( ) == 0 u) ;
143
+ assert ( d. len ( ) == 0 u) ;
167
144
d. add_back ( 3 ) ;
168
- assert ( d. size ( ) == 1 u) ;
145
+ assert ( d. len ( ) == 1 u) ;
169
146
d. add_front ( 2 ) ;
170
- assert ( d. size ( ) == 2 u) ;
147
+ assert ( d. len ( ) == 2 u) ;
171
148
d. add_back ( 4 ) ;
172
- assert ( d. size ( ) == 3 u) ;
149
+ assert ( d. len ( ) == 3 u) ;
173
150
d. add_front ( 1 ) ;
174
- assert ( d. size ( ) == 4 u) ;
151
+ assert ( d. len ( ) == 4 u) ;
175
152
log ( debug, d. get ( 0 ) ) ;
176
153
log ( debug, d. get ( 1 ) ) ;
177
154
log ( debug, d. get ( 2 ) ) ;
@@ -189,59 +166,59 @@ mod tests {
189
166
let c: @int = @64 ;
190
167
let d: @int = @175 ;
191
168
192
- let deq: deque :: Deque < @ int > = deque :: create :: < @ int > ( ) ;
193
- assert ( deq. size ( ) == 0 u) ;
169
+ let mut deq = Deque :: new ( ) ;
170
+ assert ( deq. len ( ) == 0 u) ;
194
171
deq. add_front ( a) ;
195
172
deq. add_front ( b) ;
196
173
deq. add_back ( c) ;
197
- assert ( deq. size ( ) == 3 u) ;
174
+ assert ( deq. len ( ) == 3 u) ;
198
175
deq. add_back ( d) ;
199
- assert ( deq. size ( ) == 4 u) ;
176
+ assert ( deq. len ( ) == 4 u) ;
200
177
assert ( deq. peek_front ( ) == b) ;
201
178
assert ( deq. peek_back ( ) == d) ;
202
179
assert ( deq. pop_front ( ) == b) ;
203
180
assert ( deq. pop_back ( ) == d) ;
204
181
assert ( deq. pop_back ( ) == c) ;
205
182
assert ( deq. pop_back ( ) == a) ;
206
- assert ( deq. size ( ) == 0 u) ;
183
+ assert ( deq. len ( ) == 0 u) ;
207
184
deq. add_back ( c) ;
208
- assert ( deq. size ( ) == 1 u) ;
185
+ assert ( deq. len ( ) == 1 u) ;
209
186
deq. add_front ( b) ;
210
- assert ( deq. size ( ) == 2 u) ;
187
+ assert ( deq. len ( ) == 2 u) ;
211
188
deq. add_back ( d) ;
212
- assert ( deq. size ( ) == 3 u) ;
189
+ assert ( deq. len ( ) == 3 u) ;
213
190
deq. add_front ( a) ;
214
- assert ( deq. size ( ) == 4 u) ;
191
+ assert ( deq. len ( ) == 4 u) ;
215
192
assert ( deq. get ( 0 ) == a) ;
216
193
assert ( deq. get ( 1 ) == b) ;
217
194
assert ( deq. get ( 2 ) == c) ;
218
195
assert ( deq. get ( 3 ) == d) ;
219
196
}
220
197
221
198
fn test_parameterized < T : Copy Eq Durable > ( a : T , b : T , c : T , d : T ) {
222
- let deq: deque :: Deque < T > = deque :: create :: < T > ( ) ;
223
- assert ( deq. size ( ) == 0 u) ;
199
+ let mut deq = Deque :: new ( ) ;
200
+ assert ( deq. len ( ) == 0 u) ;
224
201
deq. add_front ( a) ;
225
202
deq. add_front ( b) ;
226
203
deq. add_back ( c) ;
227
- assert ( deq. size ( ) == 3 u) ;
204
+ assert ( deq. len ( ) == 3 u) ;
228
205
deq. add_back ( d) ;
229
- assert ( deq. size ( ) == 4 u) ;
206
+ assert ( deq. len ( ) == 4 u) ;
230
207
assert deq. peek_front ( ) == b;
231
208
assert deq. peek_back ( ) == d;
232
209
assert deq. pop_front ( ) == b;
233
210
assert deq. pop_back ( ) == d;
234
211
assert deq. pop_back ( ) == c;
235
212
assert deq. pop_back ( ) == a;
236
- assert ( deq. size ( ) == 0 u) ;
213
+ assert ( deq. len ( ) == 0 u) ;
237
214
deq. add_back ( c) ;
238
- assert ( deq. size ( ) == 1 u) ;
215
+ assert ( deq. len ( ) == 1 u) ;
239
216
deq. add_front ( b) ;
240
- assert ( deq. size ( ) == 2 u) ;
217
+ assert ( deq. len ( ) == 2 u) ;
241
218
deq. add_back ( d) ;
242
- assert ( deq. size ( ) == 3 u) ;
219
+ assert ( deq. len ( ) == 3 u) ;
243
220
deq. add_front ( a) ;
244
- assert ( deq. size ( ) == 4 u) ;
221
+ assert ( deq. len ( ) == 4 u) ;
245
222
assert deq. get ( 0 ) == a;
246
223
assert deq. get ( 1 ) == b;
247
224
assert deq. get ( 2 ) == c;
0 commit comments