Skip to content

Commit e42d106

Browse files
author
Ian Burns
authored
Merge pull request iwburns#27 from clbarnes/master
Remove unreachables from pub methods in Tree
2 parents e8bcba2 + 1c4ac17 commit e42d106

File tree

3 files changed

+44
-41
lines changed

3 files changed

+44
-41
lines changed

src/iter.rs

+16-19
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ impl<'a, T> Iterator for PreOrder<'a, T> {
8181
.push(NextSiblings::new(first_child_id, self.tree));
8282
Some(node)
8383
} else {
84-
while self.children.len() > 0 {
84+
while !self.children.is_empty() {
8585
if let Some(node_ref) = self.children.last_mut().and_then(Iterator::next) {
8686
if let Some(first_child) = node_ref.first_child() {
8787
self.children
@@ -197,26 +197,23 @@ impl<'a, T> Iterator for LevelOrder<'a, T> {
197197
let first_child_id = next.first_child().map(|child| child.node_id());
198198
self.levels
199199
.push((next.node_id(), NextSiblings::new(first_child_id, self.tree)));
200-
} else {
201-
if level == 1 {
202-
if on_level < next_level {
203-
on_level += 1;
204-
let node = self
205-
.tree
206-
.get(node_id)
207-
.expect("getting node of existing node ref id");
208-
let first_child_id =
209-
node.first_child().map(|child| child.node_id());
210-
self.levels.push((
211-
node.node_id(),
212-
NextSiblings::new(first_child_id, self.tree),
213-
));
214-
} else {
215-
break;
216-
}
200+
} else if level == 1 {
201+
if on_level < next_level {
202+
on_level += 1;
203+
let node = self
204+
.tree
205+
.get(node_id)
206+
.expect("getting node of existing node ref id");
207+
let first_child_id = node.first_child().map(|child| child.node_id());
208+
self.levels.push((
209+
node.node_id(),
210+
NextSiblings::new(first_child_id, self.tree),
211+
));
217212
} else {
218-
level -= 1;
213+
break;
219214
}
215+
} else {
216+
level -= 1;
220217
}
221218
}
222219
}

src/lib.rs

+17-20
Original file line numberDiff line numberDiff line change
@@ -33,26 +33,23 @@
3333
//! ```
3434
//! use slab_tree::*;
3535
//!
36-
//! fn main() {
37-
//!
38-
//! // "hello"
39-
//! // / \
40-
//! // "world" "trees"
41-
//! // |
42-
//! // "are"
43-
//! // |
44-
//! // "cool"
45-
//!
46-
//! let mut tree = TreeBuilder::new().with_root("hello").build();
47-
//! let root_id = tree.root_id().expect("root doesn't exist?");
48-
//! let mut hello = tree.get_mut(root_id).unwrap();
49-
//!
50-
//! hello.append("world");
51-
//! hello
52-
//! .append("trees")
53-
//! .append("are")
54-
//! .append("cool");
55-
//! }
36+
//! // "hello"
37+
//! // / \
38+
//! // "world" "trees"
39+
//! // |
40+
//! // "are"
41+
//! // |
42+
//! // "cool"
43+
//!
44+
//! let mut tree = TreeBuilder::new().with_root("hello").build();
45+
//! let root_id = tree.root_id().expect("root doesn't exist?");
46+
//! let mut hello = tree.get_mut(root_id).unwrap();
47+
//!
48+
//! hello.append("world");
49+
//! hello
50+
//! .append("trees")
51+
//! .append("are")
52+
//! .append("cool");
5653
//! ```
5754
//!
5855
//! ## `NodeId`s

src/tree.rs

+11-2
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ impl<T> Tree<T> {
337337
}
338338
self.core_tree.remove(node_id)
339339
} else {
340-
unreachable!();
340+
None
341341
}
342342
}
343343

@@ -486,7 +486,7 @@ impl<T> Tree<T> {
486486
})
487487
.unwrap_or((false, false))
488488
} else {
489-
unreachable!()
489+
(false, false)
490490
}
491491
}
492492
}
@@ -744,6 +744,15 @@ mod tree_tests {
744744
assert!(five.is_none());
745745
}
746746

747+
/// Test that there is no panic if caller tries to remove a removed node
748+
#[test]
749+
fn address_dropped() {
750+
let mut tree = TreeBuilder::new().with_root(1).build();
751+
let two_id = tree.root_mut().expect("root doesn't exist").node_id();
752+
tree.remove(two_id, DropChildren);
753+
tree.remove(two_id, DropChildren);
754+
}
755+
747756
#[test]
748757
fn remove_orphan() {
749758
let mut tree = TreeBuilder::new().with_root(1).build();

0 commit comments

Comments
 (0)