From a1af2cded82abac282573bb0dc8049329b36717d Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 14 Aug 2016 15:01:51 +0200 Subject: [PATCH 1/2] Use impl DoubleEndedIterator for two flow_list iterators --- components/layout/flow.rs | 4 ++-- components/layout/flow_list.rs | 32 ++++---------------------------- components/layout/lib.rs | 1 + 3 files changed, 7 insertions(+), 30 deletions(-) diff --git a/components/layout/flow.rs b/components/layout/flow.rs index 29102690a4d..2b42957826e 100644 --- a/components/layout/flow.rs +++ b/components/layout/flow.rs @@ -31,7 +31,7 @@ use context::LayoutContext; use display_list_builder::DisplayListBuildState; use euclid::{Point2D, Rect, Size2D}; use floats::{Floats, SpeculatedFloatPlacement}; -use flow_list::{FlowList, FlowListIterator, MutFlowListIterator}; +use flow_list::{FlowList, MutFlowListIterator}; use flow_ref::{self, FlowRef, WeakFlowRef}; use fragment::{Fragment, FragmentBorderBoxIterator, Overflow, SpecificFragmentInfo}; use gfx::display_list::{ClippingRegion, StackingContext}; @@ -432,7 +432,7 @@ pub fn base(this: &T) -> &BaseFlow { } /// Iterates over the children of this immutable flow. -pub fn child_iter<'a>(flow: &'a Flow) -> FlowListIterator<'a> { +pub fn child_iter<'a>(flow: &'a Flow) -> impl Iterator { base(flow).children.iter() } diff --git a/components/layout/flow_list.rs b/components/layout/flow_list.rs index c9bbe0d7cd8..5a5e2281d80 100644 --- a/components/layout/flow_list.rs +++ b/components/layout/flow_list.rs @@ -13,10 +13,6 @@ pub struct FlowList { flows: LinkedList, } -pub struct FlowListIterator<'a> { - it: linked_list::Iter<'a, FlowRef>, -} - pub struct MutFlowListIterator<'a> { it: linked_list::IterMut<'a, FlowRef>, } @@ -58,10 +54,8 @@ impl FlowList { /// Provide a forward iterator #[inline] - pub fn iter(&self) -> FlowListIterator { - FlowListIterator { - it: self.flows.iter(), - } + pub fn iter<'a>(&'a self) -> impl DoubleEndedIterator { + self.flows.iter().map(|flow| &**flow) } /// Provide a forward iterator with mutable references @@ -74,7 +68,8 @@ impl FlowList { /// Provide a forward iterator with FlowRef items #[inline] - pub fn iter_flow_ref_mut<'a>(&'a mut self) -> linked_list::IterMut<'a, FlowRef> { + pub fn iter_flow_ref_mut<'a>(&'a mut self) + -> impl DoubleEndedIterator { self.flows.iter_mut() } @@ -98,25 +93,6 @@ impl FlowList { } } -impl<'a> Iterator for FlowListIterator<'a> { - type Item = &'a Flow; - #[inline] - fn next(&mut self) -> Option<&'a Flow> { - self.it.next().map(|x| &**x) - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - self.it.size_hint() - } -} - -impl<'a> DoubleEndedIterator for FlowListIterator<'a> { - fn next_back(&mut self) -> Option<&'a Flow> { - self.it.next_back().map(|x| &**x) - } -} - impl<'a> DoubleEndedIterator for MutFlowListIterator<'a> { fn next_back(&mut self) -> Option<&'a mut Flow> { self.it.next_back().map(flow_ref::deref_mut) diff --git a/components/layout/lib.rs b/components/layout/lib.rs index 65066b638e0..5991c769b2f 100644 --- a/components/layout/lib.rs +++ b/components/layout/lib.rs @@ -4,6 +4,7 @@ #![feature(box_patterns)] #![feature(box_syntax)] +#![feature(conservative_impl_trait)] #![feature(custom_derive)] #![feature(nonzero)] #![feature(plugin)] From 1637b0ba8a66839e3329a3cf552ab2d4fb3c67c6 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 14 Aug 2016 19:05:14 +0200 Subject: [PATCH 2/2] Simplify CSSStyleDeclaration::GetPropertyValue While Fn(_) -> _ isn't Clone, fn(_) -> _ is. --- components/script/dom/cssstyledeclaration.rs | 21 +++++--------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index 101ac3ef252..1ab80ebf19a 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -14,12 +14,11 @@ use dom::element::{Element, StylePriority}; use dom::node::{Node, NodeDamage, window_from_node}; use dom::window::Window; use std::ascii::AsciiExt; -use std::cell::Ref; -use std::slice; +use std::ops::Deref; use string_cache::Atom; use style::parser::ParserContextExtraData; -use style::properties::{PropertyDeclaration, Shorthand}; -use style::properties::{is_supported_property, parse_one_declaration, parse_style_attribute}; +use style::properties::{Shorthand, is_supported_property}; +use style::properties::{parse_one_declaration, parse_style_attribute}; use style::selector_impl::PseudoElement; // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface @@ -148,19 +147,9 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { } } - // Step 2.3 - // Work around closures not being Clone - #[derive(Clone)] - struct Map<'a, 'b: 'a>(slice::Iter<'a, Ref<'b, PropertyDeclaration>>); - impl<'a, 'b> Iterator for Map<'a, 'b> { - type Item = &'a PropertyDeclaration; - fn next(&mut self) -> Option { - self.0.next().map(|r| &**r) - } - } - // TODO: important is hardcoded to false because method does not implement it yet - let serialized_value = shorthand.serialize_shorthand_value_to_string(Map(list.iter()), false); + let serialized_value = shorthand.serialize_shorthand_value_to_string( + list.iter().map(Deref::deref as fn(_) -> _), false); return DOMString::from(serialized_value); }