Skip to content

Commit 30bdf56

Browse files
authored
Merge pull request #32 from adamreichold/fuse-traverse
Implement FusedIterator trait for the various iterators provided by this crate
2 parents 791fa94 + 8a95dde commit 30bdf56

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

src/iter.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::iter::FusedIterator;
12
use std::ops::Range;
23
use std::{slice, vec};
34

@@ -7,6 +8,7 @@ use crate::{Node, NodeId, NodeRef, Tree};
78
#[derive(Debug)]
89
pub struct IntoIter<T>(vec::IntoIter<Node<T>>);
910
impl<T> ExactSizeIterator for IntoIter<T> {}
11+
impl<T> FusedIterator for IntoIter<T> {}
1012
impl<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
}
3335
impl<'a, T: 'a> ExactSizeIterator for Values<'a, T> {}
36+
impl<'a, T: 'a> FusedIterator for Values<'a, T> {}
3437
impl<'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)]
5154
pub struct ValuesMut<'a, T: 'a>(slice::IterMut<'a, Node<T>>);
5255
impl<'a, T: 'a> ExactSizeIterator for ValuesMut<'a, T> {}
56+
impl<'a, T: 'a> FusedIterator for ValuesMut<'a, T> {}
5357
impl<'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
}
8286
impl<'a, T: 'a> ExactSizeIterator for Nodes<'a, T> {}
87+
impl<'a, T: 'a> FusedIterator for Nodes<'a, T> {}
8388
impl<'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> {}
184191
impl<'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)]
238245
pub struct Traverse<'a, T: 'a> {
239-
root: NodeRef<'a, T>,
246+
root: Option<NodeRef<'a, T>>,
240247
edge: Option<Edge<'a, T>>,
241248
}
242249
impl<'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> {}
250258
impl<'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> {}
286298
impl<'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
}

tests/iter.rs

+47
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,23 @@ fn ancestors() {
6161
);
6262
}
6363

64+
#[test]
65+
fn ancestors_fused() {
66+
let tree = tree!('a' => { 'b' => { 'c' => { 'd' } } });
67+
let d = tree
68+
.root()
69+
.last_child()
70+
.unwrap()
71+
.last_child()
72+
.unwrap()
73+
.last_child()
74+
.unwrap();
75+
76+
let mut ancestors = d.ancestors();
77+
assert_eq!(ancestors.by_ref().count(), 3);
78+
assert_eq!(ancestors.next(), None);
79+
}
80+
6481
#[test]
6582
fn prev_siblings() {
6683
let tree = tree!('a' => { 'b', 'c', 'd' });
@@ -101,6 +118,16 @@ fn children() {
101118
);
102119
}
103120

121+
#[test]
122+
fn children_fused() {
123+
let tree = tree!('a' => { 'b', 'c', 'd' });
124+
125+
let mut children = tree.root().children();
126+
127+
assert_eq!(children.by_ref().count(), 3);
128+
assert_eq!(children.next(), None);
129+
}
130+
104131
#[test]
105132
fn children_rev() {
106133
let tree = tree!('a' => { 'b', 'c', 'd' });
@@ -176,6 +203,16 @@ fn traverse() {
176203
);
177204
}
178205

206+
#[test]
207+
fn traverse_fused() {
208+
let tree = tree!('a' => { 'b' => { 'd', 'e' }, 'c' });
209+
210+
let mut traversal = tree.root().traverse();
211+
212+
assert_eq!(traversal.by_ref().count(), 2 * 5);
213+
assert_eq!(traversal.next(), None);
214+
}
215+
179216
#[test]
180217
fn descendants() {
181218
let tree = tree!('a' => { 'b' => { 'd', 'e' }, 'c' });
@@ -188,3 +225,13 @@ fn descendants() {
188225

189226
assert_eq!(&[&'a', &'b', &'d', &'e', &'c',], &descendants[..]);
190227
}
228+
229+
#[test]
230+
fn descendants_fused() {
231+
let tree = tree!('a' => { 'b' => { 'd', 'e' }, 'c' });
232+
233+
let mut descendants = tree.root().descendants();
234+
235+
assert_eq!(descendants.by_ref().count(), 5);
236+
assert_eq!(descendants.next(), None);
237+
}

0 commit comments

Comments
 (0)