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 > Mutable for Deque < T > {
32
+ fn clear ( & mut self ) {
33
+ for vec:: each_mut( self . elts) |x| { * x = None }
34
+ self . nelts = 0 ;
35
+ self . lo = 0 ;
36
+ self . hi = 0 ;
37
+ }
38
+ }
47
39
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 ;
55
- }
40
+ impl < T > Deque < T > {
41
+ static pure fn new ( ) -> Deque < T > {
42
+ Deque { nelts : 0 , lo : 0 , hi : 0 ,
43
+ elts : vec :: from_fn ( initial_capacity , |_| None ) }
44
+ }
45
+
46
+ fn peek_front ( & self ) -> & self / T { get ( self . elts , self . lo ) }
47
+ fn peek_back ( & self ) -> & self / T { get ( self . elts , self . hi - 1 u ) }
56
48
57
- rv
49
+ fn get ( & self , i : int ) -> & self /T {
50
+ let idx = ( self . lo + ( i as uint ) ) % self . elts . len ( ) ;
51
+ get ( self . elts , idx)
58
52
}
59
- fn get < T : Copy > ( elts : & DVec < Cell < T > > , i : uint ) -> T {
60
- match ( * elts) . get_elt ( i) { Some ( t) => t, _ => fail ! ( ) }
53
+
54
+ fn pop_front ( & mut self ) -> T {
55
+ let mut result = self . elts [ self . lo ] . swap_unwrap ( ) ;
56
+ self . lo = ( self . lo + 1 u) % self . elts . len ( ) ;
57
+ self . nelts -= 1 u;
58
+ result
61
59
}
62
60
63
- struct Repr < T > {
64
- mut nelts : uint ,
65
- mut lo: uint ,
66
- mut hi: uint ,
67
- elts : DVec < Cell < T > > ,
61
+ fn pop_back ( & mut self ) -> T {
62
+ if self . hi == 0 u {
63
+ self . hi = self . elts . len ( ) - 1 u;
64
+ } else { self . hi -= 1 u; }
65
+ let mut result = self . elts [ self . hi ] . swap_unwrap ( ) ;
66
+ self . elts [ self . hi ] = None ;
67
+ self . nelts -= 1 u;
68
+ result
68
69
}
69
70
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;
71
+ fn add_front ( & mut self , t : T ) {
72
+ let oldlo = self . lo ;
73
+ if self . lo == 0 u {
74
+ self . lo = self . elts . len ( ) - 1 u;
75
+ } else { self . lo -= 1 u; }
76
+ if self . lo == self . hi {
77
+ self . elts = grow ( self . nelts , oldlo, self . elts ) ;
78
+ self . lo = self . elts . len ( ) - 1 u;
79
+ self . hi = self . nelts ;
114
80
}
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) ;
81
+ self . elts [ self . lo ] = Some ( t) ;
82
+ self . nelts += 1 u;
83
+ }
84
+
85
+ fn add_back ( & mut self , t : T ) {
86
+ if self . lo == self . hi && self . nelts != 0 u {
87
+ self . elts = grow ( self . nelts , self . lo , self . elts ) ;
88
+ self . lo = 0 u;
89
+ self . hi = self . nelts ;
120
90
}
91
+ self . elts [ self . hi ] = Some ( t) ;
92
+ self . hi = ( self . hi + 1 u) % self . elts . len ( ) ;
93
+ self . nelts += 1 u;
94
+ }
95
+ }
96
+
97
+ /// Grow is only called on full elts, so nelts is also len(elts), unlike
98
+ /// elsewhere.
99
+ fn grow <T >( nelts: uint, lo: uint, elts: & mut [ Option <T >] ) -> ~[ Option <T >] {
100
+ assert nelts == elts. len ( ) ;
101
+ let mut rv = ~[ ] ;
102
+
103
+ do vec:: grow_fn ( & mut rv, nelts + 1 ) |i| {
104
+ let mut element = None ;
105
+ element <-> elts[ ( lo + i) % nelts] ;
106
+ element
121
107
}
122
108
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
- } ;
109
+ rv
110
+ }
129
111
130
- repr as Deque :: < T >
112
+ fn get<T >( elts: & r/[ Option <T >] , i: uint) -> & r/T {
113
+ match elts[ i] { Some ( ref t) => t, _ => fail ! ( ) }
131
114
}
132
115
133
116
#[ cfg( test) ]
134
117
mod tests {
135
- use core:: prelude:: * ;
136
-
137
- use deque:: * ;
138
- use deque;
118
+ use super:: * ;
139
119
140
120
#[ test]
141
121
fn test_simple( ) {
142
- let d : deque :: Deque < int > = deque :: create :: < int > ( ) ;
143
- assert ( d . size ( ) == 0 u) ;
122
+ let mut d = Deque : : new ( ) ;
123
+ assert d . len ( ) == 0 u;
144
124
d. add_front ( 17 ) ;
145
125
d. add_front ( 42 ) ;
146
126
d. add_back ( 137 ) ;
147
- assert ( d . size ( ) == 3 u) ;
127
+ assert d . len ( ) == 3 u;
148
128
d. add_back ( 137 ) ;
149
- assert ( d . size ( ) == 4 u) ;
129
+ assert d . len ( ) == 4 u;
150
130
log ( debug, d. peek_front ( ) ) ;
151
- assert ( d. peek_front ( ) == 42 ) ;
131
+ assert * d. peek_front ( ) == 42 ;
152
132
log ( debug, d. peek_back ( ) ) ;
153
- assert ( d. peek_back ( ) == 137 ) ;
133
+ assert * d. peek_back ( ) == 137 ;
154
134
let mut i: int = d. pop_front ( ) ;
155
135
log ( debug, i) ;
156
- assert ( i == 42 ) ;
136
+ assert i == 42 ;
157
137
i = d. pop_back ( ) ;
158
138
log ( debug, i) ;
159
- assert ( i == 137 ) ;
139
+ assert i == 137 ;
160
140
i = d. pop_back ( ) ;
161
141
log ( debug, i) ;
162
- assert ( i == 137 ) ;
142
+ assert i == 137 ;
163
143
i = d. pop_back ( ) ;
164
144
log ( debug, i) ;
165
- assert ( i == 17 ) ;
166
- assert ( d . size ( ) == 0 u) ;
145
+ assert i == 17 ;
146
+ assert d . len ( ) == 0 u;
167
147
d. add_back ( 3 ) ;
168
- assert ( d . size ( ) == 1 u) ;
148
+ assert d . len ( ) == 1 u;
169
149
d. add_front ( 2 ) ;
170
- assert ( d . size ( ) == 2 u) ;
150
+ assert d . len ( ) == 2 u;
171
151
d. add_back ( 4 ) ;
172
- assert ( d . size ( ) == 3 u) ;
152
+ assert d . len ( ) == 3 u;
173
153
d. add_front ( 1 ) ;
174
- assert ( d . size ( ) == 4 u) ;
154
+ assert d . len ( ) == 4 u;
175
155
log ( debug, d. get ( 0 ) ) ;
176
156
log ( debug, d. get ( 1 ) ) ;
177
157
log ( debug, d. get ( 2 ) ) ;
178
158
log ( debug, d. get ( 3 ) ) ;
179
- assert ( d. get ( 0 ) == 1 ) ;
180
- assert ( d. get ( 1 ) == 2 ) ;
181
- assert ( d. get ( 2 ) == 3 ) ;
182
- assert ( d. get ( 3 ) == 4 ) ;
159
+ assert * d. get ( 0 ) == 1 ;
160
+ assert * d. get ( 1 ) == 2 ;
161
+ assert * d. get ( 2 ) == 3 ;
162
+ assert * d. get ( 3 ) == 4 ;
183
163
}
184
164
185
165
#[ test]
@@ -189,63 +169,63 @@ mod tests {
189
169
let c: @int = @64 ;
190
170
let d: @int = @175 ;
191
171
192
- let deq: deque :: Deque < @ int > = deque :: create :: < @ int > ( ) ;
193
- assert ( deq. size ( ) == 0 u ) ;
172
+ let mut deq = Deque :: new ( ) ;
173
+ assert deq. len ( ) == 0 ;
194
174
deq. add_front ( a) ;
195
175
deq. add_front ( b) ;
196
176
deq. add_back ( c) ;
197
- assert ( deq. size ( ) == 3 u ) ;
177
+ assert deq. len ( ) == 3 ;
198
178
deq. add_back ( d) ;
199
- assert ( deq. size ( ) == 4 u ) ;
200
- assert ( deq. peek_front ( ) == b) ;
201
- assert ( deq. peek_back ( ) == d) ;
202
- assert ( deq. pop_front ( ) == b) ;
203
- assert ( deq. pop_back ( ) == d) ;
204
- assert ( deq. pop_back ( ) == c) ;
205
- assert ( deq. pop_back ( ) == a) ;
206
- assert ( deq. size ( ) == 0 u ) ;
179
+ assert deq. len ( ) == 4 ;
180
+ assert * deq. peek_front ( ) == b;
181
+ assert * deq. peek_back ( ) == d;
182
+ assert deq. pop_front ( ) == b;
183
+ assert deq. pop_back ( ) == d;
184
+ assert deq. pop_back ( ) == c;
185
+ assert deq. pop_back ( ) == a;
186
+ assert deq. len ( ) == 0 ;
207
187
deq. add_back ( c) ;
208
- assert ( deq. size ( ) == 1 u ) ;
188
+ assert deq. len ( ) == 1 ;
209
189
deq. add_front ( b) ;
210
- assert ( deq. size ( ) == 2 u ) ;
190
+ assert deq. len ( ) == 2 ;
211
191
deq. add_back ( d) ;
212
- assert ( deq. size ( ) == 3 u ) ;
192
+ assert deq. len ( ) == 3 ;
213
193
deq. add_front ( a) ;
214
- assert ( deq. size ( ) == 4 u ) ;
215
- assert ( deq. get ( 0 ) == a) ;
216
- assert ( deq. get ( 1 ) == b) ;
217
- assert ( deq. get ( 2 ) == c) ;
218
- assert ( deq. get ( 3 ) == d) ;
194
+ assert deq. len ( ) == 4 ;
195
+ assert * deq. get ( 0 ) == a;
196
+ assert * deq. get ( 1 ) == b;
197
+ assert * deq. get ( 2 ) == c;
198
+ assert * deq. get ( 3 ) == d;
219
199
}
220
200
221
201
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 ) ;
202
+ let mut deq = Deque :: new ( ) ;
203
+ assert deq. len ( ) == 0 ;
224
204
deq. add_front ( a) ;
225
205
deq. add_front ( b) ;
226
206
deq. add_back ( c) ;
227
- assert ( deq. size ( ) == 3 u ) ;
207
+ assert deq. len ( ) == 3 ;
228
208
deq. add_back ( d) ;
229
- assert ( deq. size ( ) == 4 u ) ;
230
- assert deq. peek_front ( ) == b;
231
- assert deq. peek_back ( ) == d;
209
+ assert deq. len ( ) == 4 ;
210
+ assert * deq. peek_front ( ) == b;
211
+ assert * deq. peek_back ( ) == d;
232
212
assert deq. pop_front ( ) == b;
233
213
assert deq. pop_back ( ) == d;
234
214
assert deq. pop_back ( ) == c;
235
215
assert deq. pop_back ( ) == a;
236
- assert ( deq. size ( ) == 0 u ) ;
216
+ assert deq. len ( ) == 0 ;
237
217
deq. add_back ( c) ;
238
- assert ( deq. size ( ) == 1 u ) ;
218
+ assert deq. len ( ) == 1 ;
239
219
deq. add_front ( b) ;
240
- assert ( deq. size ( ) == 2 u ) ;
220
+ assert deq. len ( ) == 2 ;
241
221
deq. add_back ( d) ;
242
- assert ( deq. size ( ) == 3 u ) ;
222
+ assert deq. len ( ) == 3 ;
243
223
deq. add_front ( a) ;
244
- assert ( deq. size ( ) == 4 u ) ;
245
- assert deq. get ( 0 ) == a;
246
- assert deq. get ( 1 ) == b;
247
- assert deq. get ( 2 ) == c;
248
- assert deq. get ( 3 ) == d;
224
+ assert deq. len ( ) == 4 ;
225
+ assert * deq. get ( 0 ) == a;
226
+ assert * deq. get ( 1 ) == b;
227
+ assert * deq. get ( 2 ) == c;
228
+ assert * deq. get ( 3 ) == d;
249
229
}
250
230
251
231
#[ deriving_eq]
0 commit comments