1+ use std:: iter:: FusedIterator ;
12use std:: ops:: Range ;
23use std:: { slice, vec} ;
34
@@ -7,6 +8,7 @@ use crate::{Node, NodeId, NodeRef, Tree};
78#[ derive( Debug ) ]
89pub struct IntoIter < T > ( vec:: IntoIter < Node < T > > ) ;
910impl < T > ExactSizeIterator for IntoIter < T > { }
11+ impl < T > FusedIterator for IntoIter < T > { }
1012impl < T > Iterator for IntoIter < T > {
1113 type Item = T ;
1214 fn next ( & mut self ) -> Option < Self :: Item > {
@@ -31,6 +33,7 @@ impl<'a, T: 'a> Clone for Values<'a, T> {
3133 }
3234}
3335impl < ' a , T : ' a > ExactSizeIterator for Values < ' a , T > { }
36+ impl < ' a , T : ' a > FusedIterator for Values < ' a , T > { }
3437impl < ' a , T : ' a > Iterator for Values < ' a , T > {
3538 type Item = & ' a T ;
3639 fn next ( & mut self ) -> Option < Self :: Item > {
@@ -50,6 +53,7 @@ impl<'a, T: 'a> DoubleEndedIterator for Values<'a, T> {
5053#[ derive( Debug ) ]
5154pub struct ValuesMut < ' a , T : ' a > ( slice:: IterMut < ' a , Node < T > > ) ;
5255impl < ' a , T : ' a > ExactSizeIterator for ValuesMut < ' a , T > { }
56+ impl < ' a , T : ' a > FusedIterator for ValuesMut < ' a , T > { }
5357impl < ' a , T : ' a > Iterator for ValuesMut < ' a , T > {
5458 type Item = & ' a mut T ;
5559 fn next ( & mut self ) -> Option < Self :: Item > {
@@ -80,6 +84,7 @@ impl<'a, T: 'a> Clone for Nodes<'a, T> {
8084 }
8185}
8286impl < ' a , T : ' a > ExactSizeIterator for Nodes < ' a , T > { }
87+ impl < ' a , T : ' a > FusedIterator for Nodes < ' a , T > { }
8388impl < ' a , T : ' a > Iterator for Nodes < ' a , T > {
8489 type Item = NodeRef < ' a , T > ;
8590 fn next ( & mut self ) -> Option < Self :: Item > {
@@ -138,6 +143,7 @@ macro_rules! axis_iterators {
138143 $i( self . 0 )
139144 }
140145 }
146+ impl <' a, T : ' a> FusedIterator for $i<' a, T > { }
141147 impl <' a, T : ' a> Iterator for $i<' a, T > {
142148 type Item = NodeRef <' a, T >;
143149 fn next( & mut self ) -> Option <Self :: Item > {
@@ -181,6 +187,7 @@ impl<'a, T: 'a> Clone for Children<'a, T> {
181187 }
182188 }
183189}
190+ impl < ' a , T : ' a > FusedIterator for Children < ' a , T > { }
184191impl < ' a , T : ' a > Iterator for Children < ' a , T > {
185192 type Item = NodeRef < ' a , T > ;
186193 fn next ( & mut self ) -> Option < Self :: Item > {
@@ -236,7 +243,7 @@ impl<'a, T: 'a> PartialEq for Edge<'a, T> {
236243/// Iterator which traverses a subtree.
237244#[ derive( Debug ) ]
238245pub struct Traverse < ' a , T : ' a > {
239- root : NodeRef < ' a , T > ,
246+ root : Option < NodeRef < ' a , T > > ,
240247 edge : Option < Edge < ' a , T > > ,
241248}
242249impl < ' a , T : ' a > Clone for Traverse < ' a , T > {
@@ -247,12 +254,15 @@ impl<'a, T: 'a> Clone for Traverse<'a, T> {
247254 }
248255 }
249256}
257+ impl < ' a , T : ' a > FusedIterator for Traverse < ' a , T > { }
250258impl < ' a , T : ' a > Iterator for Traverse < ' a , T > {
251259 type Item = Edge < ' a , T > ;
252260 fn next ( & mut self ) -> Option < Self :: Item > {
253261 match self . edge {
254262 None => {
255- self . edge = Some ( Edge :: Open ( self . root ) ) ;
263+ if let Some ( root) = self . root {
264+ self . edge = Some ( Edge :: Open ( root) ) ;
265+ }
256266 }
257267 Some ( Edge :: Open ( node) ) => {
258268 if let Some ( first_child) = node. first_child ( ) {
@@ -262,7 +272,8 @@ impl<'a, T: 'a> Iterator for Traverse<'a, T> {
262272 }
263273 }
264274 Some ( Edge :: Close ( node) ) => {
265- if node == self . root {
275+ if node == self . root . unwrap ( ) {
276+ self . root = None ;
266277 self . edge = None ;
267278 } else if let Some ( next_sibling) = node. next_sibling ( ) {
268279 self . edge = Some ( Edge :: Open ( next_sibling) ) ;
@@ -283,6 +294,7 @@ impl<'a, T: 'a> Clone for Descendants<'a, T> {
283294 Descendants ( self . 0 . clone ( ) )
284295 }
285296}
297+ impl < ' a , T : ' a > FusedIterator for Descendants < ' a , T > { }
286298impl < ' a , T : ' a > Iterator for Descendants < ' a , T > {
287299 type Item = NodeRef < ' a , T > ;
288300 fn next ( & mut self ) -> Option < Self :: Item > {
@@ -332,7 +344,7 @@ impl<'a, T: 'a> NodeRef<'a, T> {
332344 /// Returns an iterator which traverses the subtree starting at this node.
333345 pub fn traverse ( & self ) -> Traverse < ' a , T > {
334346 Traverse {
335- root : * self ,
347+ root : Some ( * self ) ,
336348 edge : None ,
337349 }
338350 }
0 commit comments