diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2014-01-08 16:08:42 +0000 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2014-01-08 16:08:42 +0000 |
commit | 8d8a8ad6e7cc20389eebbf25069ccfa629617c0c (patch) | |
tree | 4cc09cd77970d42b7172ca80736cec79307244f3 /src | |
parent | 724fd7caaf87048b6188c7bb252c5b18ddf11d8c (diff) | |
download | servo-8d8a8ad6e7cc20389eebbf25069ccfa629617c0c.tar.gz servo-8d8a8ad6e7cc20389eebbf25069ccfa629617c0c.zip |
De-duplicate some redundant code with a macro.
Diffstat (limited to 'src')
-rw-r--r-- | src/components/main/css/matching.rs | 125 |
1 files changed, 30 insertions, 95 deletions
diff --git a/src/components/main/css/matching.rs b/src/components/main/css/matching.rs index 87d91006f20..cace6ffd5f1 100644 --- a/src/components/main/css/matching.rs +++ b/src/components/main/css/matching.rs @@ -24,9 +24,6 @@ pub trait MatchMethods { fn match_node(&self, stylist: &Stylist); fn match_subtree(&self, stylist: RWArc<Stylist>); - fn cascade_before_node(&self, parent: Option<LayoutNode>); - fn cascade_node(&self, parent: Option<LayoutNode>); - fn cascade_after_node(&self, parent: Option<LayoutNode>); fn cascade_subtree(&self, parent: Option<LayoutNode>); } @@ -102,109 +99,47 @@ impl<'self> MatchMethods for LayoutNode<'self> { } } - fn cascade_before_node(&self, parent: Option<LayoutNode>) { - let parent_style = match parent { - Some(ref parent) => Some(parent.style()), - None => None - }; - - let computed_values = unsafe { - Arc::new(cascade(self.borrow_layout_data_unchecked() - .as_ref() - .unwrap() - .before_applicable_declarations, - parent_style.map(|parent_style| parent_style.get()))) - }; - - match *self.mutate_layout_data().ptr { - None => fail!("no layout data"), - Some(ref mut layout_data) => { - let style = &mut layout_data.before_style; - match *style { - None => (), - Some(ref previous_style) => { - layout_data.restyle_damage = - Some(incremental::compute_damage(previous_style.get(), - computed_values.get()).to_int()) - } - } - *style = Some(computed_values) - } - } - } - - fn cascade_node(&self, parent: Option<LayoutNode>) { - let parent_style = match parent { - Some(ref parent) => Some(parent.style()), - None => None - }; - - let computed_values = unsafe { - Arc::new(cascade(self.borrow_layout_data_unchecked() - .as_ref() - .unwrap() - .applicable_declarations, - parent_style.map(|parent_style| parent_style.get()))) - }; - - match *self.mutate_layout_data().ptr { - None => fail!("no layout data"), - Some(ref mut layout_data) => { - let style = &mut layout_data.style; - match *style { - None => (), - Some(ref previous_style) => { - layout_data.restyle_damage = - Some(incremental::compute_damage(previous_style.get(), - computed_values.get()).to_int()) - } - } - *style = Some(computed_values) - } - } - } - - fn cascade_after_node(&self, parent: Option<LayoutNode>) { - let parent_style = match parent { - Some(ref parent) => Some(parent.style()), - None => None - }; - - let computed_values = unsafe { - Arc::new(cascade(self.borrow_layout_data_unchecked() - .as_ref() - .unwrap() - .after_applicable_declarations, - parent_style.map(|parent_style| parent_style.get()))) + fn cascade_subtree(&self, parent: Option<LayoutNode>) { + let layout_data = unsafe { + self.borrow_layout_data_unchecked().as_ref().unwrap() }; + macro_rules! cascade_node( + ($applicable_declarations: ident, $style: ident) => {{ + let parent_style = match parent { + Some(ref parent) => Some(parent.style()), + None => None + }; - match *self.mutate_layout_data().ptr { - None => fail!("no layout data"), - Some(ref mut layout_data) => { - let style = &mut layout_data.after_style; - match *style { - None => (), - Some(ref previous_style) => { - layout_data.restyle_damage = - Some(incremental::compute_damage(previous_style.get(), - computed_values.get()).to_int()) + let computed_values = Arc::new(cascade( + layout_data.$applicable_declarations, + parent_style.map(|parent_style| parent_style.get()))); + + match *self.mutate_layout_data().ptr { + None => fail!("no layout data"), + Some(ref mut layout_data) => { + let style = &mut layout_data.$style; + match *style { + None => (), + Some(ref previous_style) => { + layout_data.restyle_damage = Some(incremental::compute_damage( + previous_style.get(), computed_values.get()).to_int()) + } + } + *style = Some(computed_values) } } - *style = Some(computed_values) - } - } - } + }} + ); - fn cascade_subtree(&self, parent: Option<LayoutNode>) { unsafe { if self.borrow_layout_data_unchecked().as_ref().unwrap().before_applicable_declarations.len() > 0 { - self.cascade_before_node(parent); + cascade_node!(before_applicable_declarations, before_style); } } - self.cascade_node(parent); + cascade_node!(applicable_declarations, style); unsafe { if self.borrow_layout_data_unchecked().as_ref().unwrap().after_applicable_declarations.len() > 0 { - self.cascade_after_node(parent); + cascade_node!(after_applicable_declarations, after_style); } } |