@@ -145,7 +145,7 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
145
145
pub fn iter < ' a > ( & ' a self ) -> TreeMapIterator < ' a , K , V > {
146
146
TreeMapIterator {
147
147
stack : ~[ ] ,
148
- node : & self . root ,
148
+ node : deref ( & self . root ) ,
149
149
remaining_min : self . length ,
150
150
remaining_max : self . length
151
151
}
@@ -162,7 +162,7 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
162
162
fn iter_for_traversal < ' a > ( & ' a self ) -> TreeMapIterator < ' a , K , V > {
163
163
TreeMapIterator {
164
164
stack : ~[ ] ,
165
- node : & self . root ,
165
+ node : deref ( & self . root ) ,
166
166
remaining_min : 0 ,
167
167
remaining_max : self . length
168
168
}
@@ -173,8 +173,8 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
173
173
pub fn lower_bound_iter < ' a > ( & ' a self , k : & K ) -> TreeMapIterator < ' a , K , V > {
174
174
let mut iter: TreeMapIterator < ' a , K , V > = self . iter_for_traversal ( ) ;
175
175
loop {
176
- match * iter. node {
177
- Some ( ref r) => {
176
+ match iter. node {
177
+ Some ( r) => {
178
178
match k. cmp ( & r. key ) {
179
179
Less => iter_traverse_left ( & mut iter) ,
180
180
Greater => iter_traverse_right ( & mut iter) ,
@@ -197,8 +197,8 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
197
197
pub fn upper_bound_iter < ' a > ( & ' a self , k : & K ) -> TreeMapIterator < ' a , K , V > {
198
198
let mut iter: TreeMapIterator < ' a , K , V > = self . iter_for_traversal ( ) ;
199
199
loop {
200
- match * iter. node {
201
- Some ( ref r) => {
200
+ match iter. node {
201
+ Some ( r) => {
202
202
match k. cmp ( & r. key ) {
203
203
Less => iter_traverse_left ( & mut iter) ,
204
204
Greater => iter_traverse_right ( & mut iter) ,
@@ -229,24 +229,34 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
229
229
230
230
/// Lazy forward iterator over a map
231
231
pub struct TreeMapIterator < ' self , K , V > {
232
- priv stack : ~[ & ' self ~ TreeNode < K , V > ] ,
233
- priv node : & ' self Option < ~ TreeNode < K , V > > ,
232
+ priv stack : ~[ & ' self TreeNode < K , V > ] ,
233
+ priv node : Option < & ' self TreeNode < K , V > > ,
234
234
priv remaining_min : uint ,
235
235
priv remaining_max : uint
236
236
}
237
237
238
+ fn deref < ' a , K , V > ( node : & ' a Option < ~TreeNode < K , V > > ) -> Option < & ' a TreeNode < K , V > > {
239
+ match * node {
240
+ Some ( ref n) => {
241
+ let n: & TreeNode < K , V > = * n;
242
+ Some ( n)
243
+ }
244
+ None => None
245
+ }
246
+ }
247
+
238
248
impl < ' self , K , V > TreeMapIterator < ' self , K , V > {
239
249
#[ inline( always) ]
240
250
fn next_ ( & mut self , forward : bool ) -> Option < ( & ' self K , & ' self V ) > {
241
251
while !self . stack . is_empty ( ) || self . node . is_some ( ) {
242
- match * self . node {
243
- Some ( ref x) => {
252
+ match self . node {
253
+ Some ( x) => {
244
254
self . stack . push ( x) ;
245
- self . node = if forward { & x. left } else { & x. right } ;
255
+ self . node = deref ( if forward { & x. left } else { & x. right } ) ;
246
256
}
247
257
None => {
248
258
let res = self . stack . pop ( ) ;
249
- self . node = if forward { & res. right } else { & res. left } ;
259
+ self . node = deref ( if forward { & res. right } else { & res. left } ) ;
250
260
self . remaining_max -= 1 ;
251
261
if self . remaining_min > 0 {
252
262
self . remaining_min -= 1 ;
@@ -302,14 +312,14 @@ impl<'self, K, V> Iterator<(&'self K, &'self V)> for TreeMapRevIterator<'self, K
302
312
/// - complete initialization with `iter_traverse_complete`
303
313
#[ inline]
304
314
fn iter_traverse_left < ' a , K , V > ( it : & mut TreeMapIterator < ' a , K , V > ) {
305
- let node = it. node . get_ref ( ) ;
315
+ let node = it. node . unwrap ( ) ;
306
316
it. stack . push ( node) ;
307
- it. node = & node. left ;
317
+ it. node = deref ( & node. left ) ;
308
318
}
309
319
310
320
#[ inline]
311
321
fn iter_traverse_right < ' a , K , V > ( it : & mut TreeMapIterator < ' a , K , V > ) {
312
- it. node = & ( it. node . get_ref ( ) . right ) ;
322
+ it. node = deref ( & it. node . get_ref ( ) . right ) ;
313
323
}
314
324
315
325
/// iter_traverse_left, iter_traverse_right and iter_traverse_complete are used to
@@ -321,11 +331,10 @@ fn iter_traverse_right<'a, K, V>(it: &mut TreeMapIterator<'a, K, V>) {
321
331
/// traversed left.
322
332
#[ inline]
323
333
fn iter_traverse_complete < ' a , K , V > ( it : & mut TreeMapIterator < ' a , K , V > ) {
324
- static none: Option < ~TreeNode < K , V > > = None ;
325
- match * it. node {
326
- Some ( ref n) => {
334
+ match it. node {
335
+ Some ( n) => {
327
336
it. stack . push ( n) ;
328
- it. node = & none ;
337
+ it. node = None ;
329
338
}
330
339
None => ( )
331
340
}
0 commit comments