@@ -204,6 +204,19 @@ impl<K: TotalOrd, V> TreeMap<K, V> {
204
204
pub fn iter < ' a > ( & ' a self ) -> TreeMapIterator < ' a , K , V > {
205
205
TreeMapIterator { stack : ~[ ] , node : & self . root , remaining : self . length }
206
206
}
207
+
208
+ /// Get a lazy iterator that consumes the treemap.
209
+ pub fn consume_iter ( self ) -> TreeMapConsumeIterator < K , V > {
210
+ let TreeMap { root : root, length : length } = self ;
211
+ let stk = match root {
212
+ None => ~[ ] ,
213
+ Some ( ~tn) => ~[ tn]
214
+ } ;
215
+ TreeMapConsumeIterator {
216
+ stack : stk,
217
+ remaining : length
218
+ }
219
+ }
207
220
}
208
221
209
222
/// Lazy forward iterator over a map
@@ -241,6 +254,56 @@ impl<'self, K, V> Iterator<(&'self K, &'self V)> for TreeMapIterator<'self, K, V
241
254
}
242
255
}
243
256
257
+ /// Lazy forward iterator over a map that consumes the map while iterating
258
+ pub struct TreeMapConsumeIterator < K , V > {
259
+ priv stack : ~[ TreeNode < K , V > ] ,
260
+ priv remaining : uint
261
+ }
262
+
263
+ impl < K , V > Iterator < ( K , V ) > for TreeMapConsumeIterator < K , V > {
264
+ #[ inline]
265
+ fn next ( & mut self ) -> Option < ( K , V ) > {
266
+ while !self . stack . is_empty ( ) {
267
+ let TreeNode {
268
+ key : key,
269
+ value : value,
270
+ left : left,
271
+ right : right,
272
+ level : level
273
+ } = self . stack . pop ( ) ;
274
+
275
+ match left {
276
+ Some ( ~left) => {
277
+ let n = TreeNode {
278
+ key : key,
279
+ value : value,
280
+ left : None ,
281
+ right : right,
282
+ level : level
283
+ } ;
284
+ self . stack . push ( n) ;
285
+ self . stack . push ( left) ;
286
+ }
287
+ None => {
288
+ match right {
289
+ Some ( ~right) => self . stack . push ( right) ,
290
+ None => ( )
291
+ }
292
+ self . remaining -= 1 ;
293
+ return Some ( ( key, value) )
294
+ }
295
+ }
296
+ }
297
+ None
298
+ }
299
+
300
+ #[ inline]
301
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
302
+ ( self . remaining , Some ( self . remaining ) )
303
+ }
304
+
305
+ }
306
+
244
307
impl < ' self , T > Iterator < & ' self T > for TreeSetIterator < ' self , T > {
245
308
/// Advance the iterator to the next node (in order). If there are no more nodes, return `None`.
246
309
#[ inline]
0 commit comments