Auto merge of #14027 - frewsxcv:htmlcollection-iter-refactor, r=emilio

Remove unnecessary `Box` around `HTMLCollectionElementsIter::node_iter`.

<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14027)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2016-11-03 16:05:14 -05:00 committed by GitHub
commit 74a3ea9135
2 changed files with 26 additions and 23 deletions

View file

@ -206,24 +206,24 @@ impl HTMLCollection {
HTMLCollection::create(window, root, box ElementChildFilter) HTMLCollection::create(window, root, box ElementChildFilter)
} }
pub fn elements_iter_after(&self, after: &Node) -> HTMLCollectionElementsIter { pub fn elements_iter_after<'a>(&'a self, after: &'a Node) -> impl Iterator<Item=Root<Element>> + 'a {
// Iterate forwards from a node. // Iterate forwards from a node.
HTMLCollectionElementsIter { HTMLCollectionElementsIter {
node_iter: box after.following_nodes(&self.root), node_iter: after.following_nodes(&self.root),
root: Root::from_ref(&self.root), root: Root::from_ref(&self.root),
filter: &self.filter, filter: &self.filter,
} }
} }
pub fn elements_iter(&self) -> HTMLCollectionElementsIter { pub fn elements_iter<'a>(&'a self) -> impl Iterator<Item=Root<Element>> + 'a {
// Iterate forwards from the root. // Iterate forwards from the root.
self.elements_iter_after(&*self.root) self.elements_iter_after(&*self.root)
} }
pub fn elements_iter_before(&self, before: &Node) -> HTMLCollectionElementsIter { pub fn elements_iter_before<'a>(&'a self, before: &'a Node) -> impl Iterator<Item=Root<Element>> + 'a {
// Iterate backwards from a node. // Iterate backwards from a node.
HTMLCollectionElementsIter { HTMLCollectionElementsIter {
node_iter: box before.preceding_nodes(&self.root), node_iter: before.preceding_nodes(&self.root),
root: Root::from_ref(&self.root), root: Root::from_ref(&self.root),
filter: &self.filter, filter: &self.filter,
} }
@ -235,13 +235,13 @@ impl HTMLCollection {
} }
// TODO: Make this generic, and avoid code duplication // TODO: Make this generic, and avoid code duplication
pub struct HTMLCollectionElementsIter<'a> { struct HTMLCollectionElementsIter<'a, I> {
node_iter: Box<Iterator<Item = Root<Node>>>, node_iter: I,
root: Root<Node>, root: Root<Node>,
filter: &'a Box<CollectionFilter>, filter: &'a Box<CollectionFilter>,
} }
impl<'a> Iterator for HTMLCollectionElementsIter<'a> { impl<'a, I: Iterator<Item=Root<Node>>> Iterator for HTMLCollectionElementsIter<'a, I> {
type Item = Root<Element>; type Item = Root<Element>;
fn next(&mut self) -> Option<Self::Item> { fn next(&mut self) -> Option<Self::Item> {
@ -285,13 +285,15 @@ impl HTMLCollectionMethods for HTMLCollection {
// Iterate forwards, starting at the cursor. // Iterate forwards, starting at the cursor.
let offset = index - (cached_index + 1); let offset = index - (cached_index + 1);
let node: Root<Node> = Root::upcast(element); let node: Root<Node> = Root::upcast(element);
self.set_cached_cursor(index, self.elements_iter_after(&node).nth(offset as usize)) let mut iter = self.elements_iter_after(&node);
self.set_cached_cursor(index, iter.nth(offset as usize))
} else { } else {
// The cursor is after the element we're looking for // The cursor is after the element we're looking for
// Iterate backwards, starting at the cursor. // Iterate backwards, starting at the cursor.
let offset = cached_index - (index + 1); let offset = cached_index - (index + 1);
let node: Root<Node> = Root::upcast(element); let node: Root<Node> = Root::upcast(element);
self.set_cached_cursor(index, self.elements_iter_before(&node).nth(offset as usize)) let mut iter = self.elements_iter_before(&node);
self.set_cached_cursor(index, iter.nth(offset as usize))
} }
} else { } else {
// Cache miss // Cache miss

View file

@ -853,22 +853,23 @@ impl Node {
let tr = new_child(); let tr = new_child();
let after_node = if index == -1 {
None
} else {
match get_items().elements_iter()
.map(Root::upcast::<Node>)
.map(Some)
.chain(iter::once(None))
.nth(index as usize) {
None => return Err(Error::IndexSize),
Some(node) => node,
}
};
{ {
let tr_node = tr.upcast::<Node>(); let tr_node = tr.upcast::<Node>();
try!(self.InsertBefore(tr_node, after_node.r())); if index == -1 {
try!(self.InsertBefore(tr_node, None));
} else {
let items = get_items();
let node = match items.elements_iter()
.map(Root::upcast::<Node>)
.map(Some)
.chain(iter::once(None))
.nth(index as usize) {
None => return Err(Error::IndexSize),
Some(node) => node,
};
try!(self.InsertBefore(tr_node, node.r()));
}
} }
Ok(Root::upcast::<HTMLElement>(tr)) Ok(Root::upcast::<HTMLElement>(tr))