1
+ use std:: iter:: FusedIterator ;
1
2
use std:: ops:: Range ;
2
3
use std:: { slice, vec} ;
3
4
@@ -7,6 +8,7 @@ use crate::{Node, NodeId, NodeRef, Tree};
7
8
#[ derive( Debug ) ]
8
9
pub struct IntoIter < T > ( vec:: IntoIter < Node < T > > ) ;
9
10
impl < T > ExactSizeIterator for IntoIter < T > { }
11
+ impl < T > FusedIterator for IntoIter < T > { }
10
12
impl < T > Iterator for IntoIter < T > {
11
13
type Item = T ;
12
14
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -31,6 +33,7 @@ impl<'a, T: 'a> Clone for Values<'a, T> {
31
33
}
32
34
}
33
35
impl < ' a , T : ' a > ExactSizeIterator for Values < ' a , T > { }
36
+ impl < ' a , T : ' a > FusedIterator for Values < ' a , T > { }
34
37
impl < ' a , T : ' a > Iterator for Values < ' a , T > {
35
38
type Item = & ' a T ;
36
39
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -50,6 +53,7 @@ impl<'a, T: 'a> DoubleEndedIterator for Values<'a, T> {
50
53
#[ derive( Debug ) ]
51
54
pub struct ValuesMut < ' a , T : ' a > ( slice:: IterMut < ' a , Node < T > > ) ;
52
55
impl < ' a , T : ' a > ExactSizeIterator for ValuesMut < ' a , T > { }
56
+ impl < ' a , T : ' a > FusedIterator for ValuesMut < ' a , T > { }
53
57
impl < ' a , T : ' a > Iterator for ValuesMut < ' a , T > {
54
58
type Item = & ' a mut T ;
55
59
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -80,6 +84,7 @@ impl<'a, T: 'a> Clone for Nodes<'a, T> {
80
84
}
81
85
}
82
86
impl < ' a , T : ' a > ExactSizeIterator for Nodes < ' a , T > { }
87
+ impl < ' a , T : ' a > FusedIterator for Nodes < ' a , T > { }
83
88
impl < ' a , T : ' a > Iterator for Nodes < ' a , T > {
84
89
type Item = NodeRef < ' a , T > ;
85
90
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -138,6 +143,7 @@ macro_rules! axis_iterators {
138
143
$i( self . 0 )
139
144
}
140
145
}
146
+ impl <' a, T : ' a> FusedIterator for $i<' a, T > { }
141
147
impl <' a, T : ' a> Iterator for $i<' a, T > {
142
148
type Item = NodeRef <' a, T >;
143
149
fn next( & mut self ) -> Option <Self :: Item > {
@@ -181,6 +187,7 @@ impl<'a, T: 'a> Clone for Children<'a, T> {
181
187
}
182
188
}
183
189
}
190
+ impl < ' a , T : ' a > FusedIterator for Children < ' a , T > { }
184
191
impl < ' a , T : ' a > Iterator for Children < ' a , T > {
185
192
type Item = NodeRef < ' a , T > ;
186
193
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -236,7 +243,7 @@ impl<'a, T: 'a> PartialEq for Edge<'a, T> {
236
243
/// Iterator which traverses a subtree.
237
244
#[ derive( Debug ) ]
238
245
pub struct Traverse < ' a , T : ' a > {
239
- root : NodeRef < ' a , T > ,
246
+ root : Option < NodeRef < ' a , T > > ,
240
247
edge : Option < Edge < ' a , T > > ,
241
248
}
242
249
impl < ' a , T : ' a > Clone for Traverse < ' a , T > {
@@ -247,12 +254,15 @@ impl<'a, T: 'a> Clone for Traverse<'a, T> {
247
254
}
248
255
}
249
256
}
257
+ impl < ' a , T : ' a > FusedIterator for Traverse < ' a , T > { }
250
258
impl < ' a , T : ' a > Iterator for Traverse < ' a , T > {
251
259
type Item = Edge < ' a , T > ;
252
260
fn next ( & mut self ) -> Option < Self :: Item > {
253
261
match self . edge {
254
262
None => {
255
- self . edge = Some ( Edge :: Open ( self . root ) ) ;
263
+ if let Some ( root) = self . root {
264
+ self . edge = Some ( Edge :: Open ( root) ) ;
265
+ }
256
266
}
257
267
Some ( Edge :: Open ( node) ) => {
258
268
if let Some ( first_child) = node. first_child ( ) {
@@ -262,7 +272,8 @@ impl<'a, T: 'a> Iterator for Traverse<'a, T> {
262
272
}
263
273
}
264
274
Some ( Edge :: Close ( node) ) => {
265
- if node == self . root {
275
+ if node == self . root . unwrap ( ) {
276
+ self . root = None ;
266
277
self . edge = None ;
267
278
} else if let Some ( next_sibling) = node. next_sibling ( ) {
268
279
self . edge = Some ( Edge :: Open ( next_sibling) ) ;
@@ -283,6 +294,7 @@ impl<'a, T: 'a> Clone for Descendants<'a, T> {
283
294
Descendants ( self . 0 . clone ( ) )
284
295
}
285
296
}
297
+ impl < ' a , T : ' a > FusedIterator for Descendants < ' a , T > { }
286
298
impl < ' a , T : ' a > Iterator for Descendants < ' a , T > {
287
299
type Item = NodeRef < ' a , T > ;
288
300
fn next ( & mut self ) -> Option < Self :: Item > {
@@ -332,7 +344,7 @@ impl<'a, T: 'a> NodeRef<'a, T> {
332
344
/// Returns an iterator which traverses the subtree starting at this node.
333
345
pub fn traverse ( & self ) -> Traverse < ' a , T > {
334
346
Traverse {
335
- root : * self ,
347
+ root : Some ( * self ) ,
336
348
edge : None ,
337
349
}
338
350
}
0 commit comments