mirror of
https://github.com/servo/servo.git
synced 2025-08-02 12:10:29 +01:00
Move rev_children and traverse_preorder to LayoutNode.
These impose additional requirements on the traversal code that we want to avoid for Gecko (for now).
This commit is contained in:
parent
545ae86dff
commit
470368ecce
2 changed files with 53 additions and 52 deletions
|
@ -80,8 +80,61 @@ pub trait LayoutNode: TNode {
|
||||||
|
|
||||||
fn init_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData);
|
fn init_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData);
|
||||||
fn get_style_and_layout_data(&self) -> Option<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
|
/// 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.
|
/// node does not allow any parents or siblings of nodes to be accessed, to avoid races.
|
||||||
pub trait ThreadSafeLayoutNode: Clone + Copy + Sized + PartialEq {
|
pub trait ThreadSafeLayoutNode: Clone + Copy + Sized + PartialEq {
|
||||||
|
|
|
@ -83,10 +83,6 @@ pub trait TNode : Sized + Copy + Clone {
|
||||||
|
|
||||||
fn dump_style(self);
|
fn dump_style(self);
|
||||||
|
|
||||||
fn traverse_preorder(self) -> TreeIterator<Self> {
|
|
||||||
TreeIterator::new(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns an iterator over this node's children.
|
/// Returns an iterator over this node's children.
|
||||||
fn children(self) -> ChildrenIterator<Self> {
|
fn children(self) -> ChildrenIterator<Self> {
|
||||||
ChildrenIterator {
|
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`.
|
/// Converts self into an `OpaqueNode`.
|
||||||
fn opaque(&self) -> 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 {
|
pub struct ChildrenIterator<ConcreteNode> where ConcreteNode: TNode {
|
||||||
current: Option<ConcreteNode>,
|
current: Option<ConcreteNode>,
|
||||||
}
|
}
|
||||||
|
@ -296,17 +258,3 @@ impl<ConcreteNode> Iterator for ChildrenIterator<ConcreteNode>
|
||||||
node
|
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue