From af1bbd7b06fa2114ee6f80abb39042b637c370f0 Mon Sep 17 00:00:00 2001 From: Bobby Holley Date: Fri, 18 Jan 2019 12:39:29 -0800 Subject: [PATCH] style: Derive more. Differential Revision: https://phabricator.services.mozilla.com/D17029 --- components/selectors/builder.rs | 34 +------------------ components/selectors/lib.rs | 2 ++ components/style/context.rs | 16 +-------- components/style/driver.rs | 9 ++--- components/style/lib.rs | 2 ++ components/style/values/computed/angle.rs | 12 +------ components/style/values/distance.rs | 20 +---------- components/style/values/specified/svg_path.rs | 10 +----- 8 files changed, 14 insertions(+), 91 deletions(-) diff --git a/components/selectors/builder.rs b/components/selectors/builder.rs index e653af58fd5..80e8457cfc8 100644 --- a/components/selectors/builder.rs +++ b/components/selectors/builder.rs @@ -23,7 +23,6 @@ use servo_arc::{Arc, HeaderWithLength, ThinArc}; use smallvec::{self, SmallVec}; use std::cmp; use std::iter; -use std::ops::{Add, AddAssign}; use std::ptr; use std::slice; @@ -222,44 +221,13 @@ impl SpecificityAndFlags { const MAX_10BIT: u32 = (1u32 << 10) - 1; -#[derive(Clone, Copy, Eq, Ord, PartialEq, PartialOrd)] +#[derive(Add, AddAssign, Clone, Copy, Default, Eq, Ord, PartialEq, PartialOrd)] struct Specificity { id_selectors: u32, class_like_selectors: u32, element_selectors: u32, } -impl AddAssign for Specificity { - #[inline] - fn add_assign(&mut self, rhs: Self) { - self.id_selectors += rhs.id_selectors; - self.class_like_selectors += rhs.class_like_selectors; - self.element_selectors += rhs.element_selectors; - } -} - -impl Add for Specificity { - type Output = Specificity; - - fn add(self, rhs: Specificity) -> Specificity { - Specificity { - id_selectors: self.id_selectors + rhs.id_selectors, - class_like_selectors: self.class_like_selectors + rhs.class_like_selectors, - element_selectors: self.element_selectors + rhs.element_selectors, - } - } -} - -impl Default for Specificity { - fn default() -> Specificity { - Specificity { - id_selectors: 0, - class_like_selectors: 0, - element_selectors: 0, - } - } -} - impl From for Specificity { #[inline] fn from(value: u32) -> Specificity { diff --git a/components/selectors/lib.rs b/components/selectors/lib.rs index 02c34f4b7e7..1d9bf58edb3 100644 --- a/components/selectors/lib.rs +++ b/components/selectors/lib.rs @@ -9,6 +9,8 @@ extern crate bitflags; #[macro_use] extern crate cssparser; +#[macro_use] +extern crate derive_more; extern crate fxhash; #[macro_use] extern crate log; diff --git a/components/style/context.rs b/components/style/context.rs index aca1d24f2ea..0bb50217ef3 100644 --- a/components/style/context.rs +++ b/components/style/context.rs @@ -304,7 +304,7 @@ impl ElementCascadeInputs { /// Statistics gathered during the traversal. We gather statistics on each /// thread and then combine them after the threads join via the Add /// implementation below. -#[derive(Default)] +#[derive(AddAssign, Clone, Default)] pub struct PerThreadTraversalStatistics { /// The total number of elements traversed. pub elements_traversed: u32, @@ -319,20 +319,6 @@ pub struct PerThreadTraversalStatistics { pub styles_reused: u32, } -/// Implementation of Add to aggregate statistics across different threads. -impl<'a> ops::Add for &'a PerThreadTraversalStatistics { - type Output = PerThreadTraversalStatistics; - fn add(self, other: Self) -> PerThreadTraversalStatistics { - PerThreadTraversalStatistics { - elements_traversed: self.elements_traversed + other.elements_traversed, - elements_styled: self.elements_styled + other.elements_styled, - elements_matched: self.elements_matched + other.elements_matched, - styles_shared: self.styles_shared + other.styles_shared, - styles_reused: self.styles_reused + other.styles_reused, - } - } -} - /// Statistics gathered during the traversal plus some information from /// other sources including stylist. #[derive(Default)] diff --git a/components/style/driver.rs b/components/style/driver.rs index 0685264e6e6..e9433f73a03 100644 --- a/components/style/driver.rs +++ b/components/style/driver.rs @@ -161,10 +161,11 @@ pub fn traverse_dom( let parallel = maybe_tls.is_some(); if let Some(ref mut tls) = maybe_tls { let slots = unsafe { tls.unsafe_get() }; - aggregate = slots.iter().fold(aggregate, |acc, t| match *t.borrow() { - None => acc, - Some(ref cx) => &cx.statistics + &acc, - }); + for slot in slots { + if let Some(ref cx) = *slot.borrow() { + aggregate += cx.statistics.clone(); + } + } } if report_stats { diff --git a/components/style/lib.rs b/components/style/lib.rs index 79829081b39..4976c787a68 100644 --- a/components/style/lib.rs +++ b/components/style/lib.rs @@ -37,6 +37,8 @@ extern crate crossbeam_channel; #[macro_use] extern crate cssparser; #[macro_use] +extern crate derive_more; +#[macro_use] extern crate debug_unreachable; extern crate euclid; extern crate fallible; diff --git a/components/style/values/computed/angle.rs b/components/style/values/computed/angle.rs index 6b053a6f832..d30f02d7200 100644 --- a/components/style/values/computed/angle.rs +++ b/components/style/values/computed/angle.rs @@ -9,13 +9,12 @@ use crate::values::CSSFloat; use num_traits::Zero; use std::f64::consts::PI; use std::fmt::{self, Write}; -use std::ops::Add; use std::{f32, f64}; use style_traits::{CssWriter, ToCss}; /// A computed angle in degrees. #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))] -#[derive(Animate, Clone, Copy, Debug, MallocSizeOf, PartialEq, PartialOrd, ToAnimatedZero)] +#[derive(Add, Animate, Clone, Copy, Debug, MallocSizeOf, PartialEq, PartialOrd, ToAnimatedZero)] pub struct Angle(CSSFloat); impl ToCss for Angle { @@ -66,15 +65,6 @@ impl Angle { } } -impl Add for Angle { - type Output = Self; - - #[inline] - fn add(self, rhs: Self) -> Self { - Angle(self.0 + rhs.0) - } -} - impl Zero for Angle { #[inline] fn zero() -> Self { diff --git a/components/style/values/distance.rs b/components/style/values/distance.rs index 320a09448dc..d3b4c7dfaad 100644 --- a/components/style/values/distance.rs +++ b/components/style/values/distance.rs @@ -31,7 +31,7 @@ pub trait ComputeSquaredDistance { } /// A distance between two animatable values. -#[derive(Clone, Copy, Debug)] +#[derive(Add, Clone, Copy, Debug, From)] pub struct SquaredDistance { value: f64, } @@ -114,24 +114,6 @@ impl SquaredDistance { } } -impl From for f64 { - #[inline] - fn from(distance: SquaredDistance) -> Self { - distance.value - } -} - -impl Add for SquaredDistance { - type Output = Self; - - #[inline] - fn add(self, rhs: Self) -> Self { - SquaredDistance { - value: self.value + rhs.value, - } - } -} - impl Sum for SquaredDistance { fn sum(iter: I) -> Self where diff --git a/components/style/values/specified/svg_path.rs b/components/style/values/specified/svg_path.rs index 7accbd96e84..86059c9ab2a 100644 --- a/components/style/values/specified/svg_path.rs +++ b/components/style/values/specified/svg_path.rs @@ -11,7 +11,6 @@ use crate::values::CSSFloat; use cssparser::Parser; use std::fmt::{self, Write}; use std::iter::{Cloned, Peekable}; -use std::ops::AddAssign; use std::slice; use style_traits::values::SequenceWriter; use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss}; @@ -491,6 +490,7 @@ impl IsAbsolute { /// The path coord type. #[derive( + AddAssign, Animate, Clone, ComputeSquaredDistance, @@ -513,14 +513,6 @@ impl CoordPair { } } -impl AddAssign for CoordPair { - #[inline] - fn add_assign(&mut self, other: Self) { - self.0 += other.0; - self.1 += other.1; - } -} - /// The EllipticalArc flag type. #[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo)] #[repr(C)]