@@ -37,10 +37,11 @@ impl<T:Ord> Mutable for PriorityQueue<T> {
37
37
}
38
38
39
39
impl < T : Ord > PriorityQueue < T > {
40
- /// Visit all values in the underlying vector.
41
- ///
42
- /// The values are **not** visited in order.
43
- pub fn each ( & self , f : & fn ( & T ) -> bool ) -> bool { self . data . iter ( ) . advance ( f) }
40
+ /// An iterator visiting all values in underlying vector, in
41
+ /// arbitrary order.
42
+ pub fn iter < ' a > ( & ' a self ) -> PriorityQueueIterator < ' a , T > {
43
+ PriorityQueueIterator { iter : self . data . iter ( ) }
44
+ }
44
45
45
46
/// Returns the greatest item in the queue - fails if empty
46
47
pub fn top < ' a > ( & ' a self ) -> & ' a T { & self . data [ 0 ] }
@@ -178,11 +179,33 @@ impl<T:Ord> PriorityQueue<T> {
178
179
}
179
180
}
180
181
182
+ /// PriorityQueue iterator
183
+ pub struct PriorityQueueIterator < ' self , T > {
184
+ priv iter : vec:: VecIterator < ' self , T > ,
185
+ }
186
+
187
+ impl < ' self , T > Iterator < & ' self T > for PriorityQueueIterator < ' self , T > {
188
+ #[ inline]
189
+ fn next ( & mut self ) -> Option < ( & ' self T ) > { self . iter . next ( ) }
190
+ }
191
+
181
192
#[ cfg( test) ]
182
193
mod tests {
183
194
use sort:: merge_sort;
184
195
use priority_queue:: PriorityQueue ;
185
196
197
+ #[ test]
198
+ fn test_iterator ( ) {
199
+ let data = ~[ 5 , 9 , 3 ] ;
200
+ let iterout = ~[ 9 , 5 , 3 ] ;
201
+ let pq = PriorityQueue :: from_vec ( data) ;
202
+ let mut i = 0 ;
203
+ for pq. iter( ) . advance |el| {
204
+ assert_eq ! ( * el, iterout[ i] ) ;
205
+ i += 1 ;
206
+ }
207
+ }
208
+
186
209
#[ test]
187
210
fn test_top_and_pop( ) {
188
211
let data = ~[ 2 u, 4 , 6 , 2 , 1 , 8 , 10 , 3 , 5 , 7 , 0 , 9 , 1 ] ;
0 commit comments