diff options
-rw-r--r-- | components/script_layout_interface/wrapper_traits.rs | 53 | ||||
-rw-r--r-- | components/style/dom.rs | 52 |
2 files changed, 53 insertions, 52 deletions
diff --git a/components/script_layout_interface/wrapper_traits.rs b/components/script_layout_interface/wrapper_traits.rs index bc64480b424..3c603e83396 100644 --- a/components/script_layout_interface/wrapper_traits.rs +++ b/components/script_layout_interface/wrapper_traits.rs @@ -80,8 +80,61 @@ pub trait LayoutNode: TNode { fn init_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData); fn get_style_and_layout_data(&self) -> Option<OpaqueStyleAndLayoutData>; + + fn rev_children(self) -> ReverseChildrenIterator<Self> { + ReverseChildrenIterator { + current: self.last_child(), + } + } + + fn traverse_preorder(self) -> TreeIterator<Self> { + TreeIterator::new(self) + } +} + +pub struct ReverseChildrenIterator<ConcreteNode> where ConcreteNode: TNode { + current: Option<ConcreteNode>, +} + +impl<ConcreteNode> Iterator for ReverseChildrenIterator<ConcreteNode> + where ConcreteNode: TNode { + type Item = ConcreteNode; + fn next(&mut self) -> Option<ConcreteNode> { + let node = self.current; + self.current = node.and_then(|node| node.prev_sibling()); + node + } +} + +pub struct TreeIterator<ConcreteNode> where ConcreteNode: TNode { + stack: Vec<ConcreteNode>, } +impl<ConcreteNode> TreeIterator<ConcreteNode> where ConcreteNode: LayoutNode { + fn new(root: ConcreteNode) -> TreeIterator<ConcreteNode> { + let mut stack = vec![]; + stack.push(root); + TreeIterator { + stack: stack, + } + } + + pub fn next_skipping_children(&mut self) -> Option<ConcreteNode> { + self.stack.pop() + } +} + +impl<ConcreteNode> Iterator for TreeIterator<ConcreteNode> + where ConcreteNode: LayoutNode { + type Item = ConcreteNode; + fn next(&mut self) -> Option<ConcreteNode> { + let ret = self.stack.pop(); + ret.map(|node| self.stack.extend(node.rev_children())); + ret + } +} + + /// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout /// node does not allow any parents or siblings of nodes to be accessed, to avoid races. pub trait ThreadSafeLayoutNode: Clone + Copy + Sized + PartialEq { diff --git a/components/style/dom.rs b/components/style/dom.rs index 3b0940c59ef..feae36d8ebf 100644 --- a/components/style/dom.rs +++ b/components/style/dom.rs @@ -83,10 +83,6 @@ pub trait TNode : Sized + Copy + Clone { fn dump_style(self); - fn traverse_preorder(self) -> TreeIterator<Self> { - TreeIterator::new(self) - } - /// Returns an iterator over this node's children. fn children(self) -> ChildrenIterator<Self> { ChildrenIterator { @@ -94,12 +90,6 @@ pub trait TNode : Sized + Copy + Clone { } } - fn rev_children(self) -> ReverseChildrenIterator<Self> { - ReverseChildrenIterator { - current: self.last_child(), - } - } - /// Converts self into an `OpaqueNode`. fn opaque(&self) -> OpaqueNode; @@ -255,34 +245,6 @@ pub trait TElement : PartialEq + Debug + Sized + Copy + Clone + ElementExt + Pre } } -pub struct TreeIterator<ConcreteNode> where ConcreteNode: TNode { - stack: Vec<ConcreteNode>, -} - -impl<ConcreteNode> TreeIterator<ConcreteNode> where ConcreteNode: TNode { - fn new(root: ConcreteNode) -> TreeIterator<ConcreteNode> { - let mut stack = vec![]; - stack.push(root); - TreeIterator { - stack: stack, - } - } - - pub fn next_skipping_children(&mut self) -> Option<ConcreteNode> { - self.stack.pop() - } -} - -impl<ConcreteNode> Iterator for TreeIterator<ConcreteNode> - where ConcreteNode: TNode { - type Item = ConcreteNode; - fn next(&mut self) -> Option<ConcreteNode> { - let ret = self.stack.pop(); - ret.map(|node| self.stack.extend(node.rev_children())); - ret - } -} - pub struct ChildrenIterator<ConcreteNode> where ConcreteNode: TNode { current: Option<ConcreteNode>, } @@ -296,17 +258,3 @@ impl<ConcreteNode> Iterator for ChildrenIterator<ConcreteNode> node } } - -pub struct ReverseChildrenIterator<ConcreteNode> where ConcreteNode: TNode { - current: Option<ConcreteNode>, -} - -impl<ConcreteNode> Iterator for ReverseChildrenIterator<ConcreteNode> - where ConcreteNode: TNode { - type Item = ConcreteNode; - fn next(&mut self) -> Option<ConcreteNode> { - let node = self.current; - self.current = node.and_then(|node| node.prev_sibling()); - node - } -} |