Skip to content

Commit

Permalink
style: Replace NormalDeclarationIterator return type with impl Trait.
Browse files Browse the repository at this point in the history
  • Loading branch information
heycam authored and emilio committed Sep 3, 2018
1 parent eb6aec3 commit b20bbea
Showing 1 changed file with 13 additions and 52 deletions.
65 changes: 13 additions & 52 deletions components/style/properties/declaration_block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,56 +138,9 @@ impl<'a> DoubleEndedIterator for DeclarationImportanceIterator<'a> {
}
}

/// Iterator over `PropertyDeclaration` for Importance::Normal.
///
/// TODO(emilio): This should be replaced by `impl Trait`, returning a
/// filter()ed iterator when available instead, and all the boilerplate below
/// should go.
pub struct NormalDeclarationIterator<'a>(DeclarationImportanceIterator<'a>);

impl<'a> NormalDeclarationIterator<'a> {
#[inline]
fn new(declarations: &'a [PropertyDeclaration], important: &'a SmallBitVec) -> Self {
NormalDeclarationIterator(
DeclarationImportanceIterator::new(declarations, important)
)
}
}

impl<'a> Iterator for NormalDeclarationIterator<'a> {
type Item = &'a PropertyDeclaration;

#[inline]
fn next(&mut self) -> Option<Self::Item> {
loop {
let (decl, importance) = self.0.iter.next()?;
if !importance {
return Some(decl);
}
}
}

#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.0.iter.size_hint()
}
}

impl<'a> DoubleEndedIterator for NormalDeclarationIterator<'a> {
#[inline]
fn next_back(&mut self) -> Option<Self::Item> {
loop {
let (decl, importance) = self.0.iter.next_back()?;
if !importance {
return Some(decl);
}
}
}
}

/// Iterator for AnimationValue to be generated from PropertyDeclarationBlock.
pub struct AnimationValueIterator<'a, 'cx, 'cx_a:'cx> {
iter: NormalDeclarationIterator<'a>,
iter: DeclarationImportanceIterator<'a>,
context: &'cx mut Context<'cx_a>,
default_values: &'a ComputedValues,
/// Custom properties in a keyframe if exists.
Expand All @@ -202,7 +155,7 @@ impl<'a, 'cx, 'cx_a:'cx> AnimationValueIterator<'a, 'cx, 'cx_a> {
extra_custom_properties: Option<&'a Arc<::custom_properties::CustomPropertiesMap>>,
) -> AnimationValueIterator<'a, 'cx, 'cx_a> {
AnimationValueIterator {
iter: declarations.normal_declaration_iter(),
iter: declarations.declaration_importance_iter(),
context,
default_values,
extra_custom_properties,
Expand All @@ -215,7 +168,11 @@ impl<'a, 'cx, 'cx_a:'cx> Iterator for AnimationValueIterator<'a, 'cx, 'cx_a> {
#[inline]
fn next(&mut self) -> Option<Self::Item> {
loop {
let decl = self.iter.next()?;
let (decl, importance) = self.iter.next()?;

if importance.important() {
continue;
}

let animation = AnimationValue::from_declaration(
decl,
Expand Down Expand Up @@ -287,8 +244,12 @@ impl PropertyDeclarationBlock {

/// Iterate over `PropertyDeclaration` for Importance::Normal
#[inline]
pub fn normal_declaration_iter(&self) -> NormalDeclarationIterator {
NormalDeclarationIterator::new(&self.declarations, &self.declarations_importance)
pub fn normal_declaration_iter<'a>(
&'a self,
) -> impl DoubleEndedIterator<Item = &'a PropertyDeclaration> {
self.declaration_importance_iter()
.filter(|(_, importance)| !importance.important())
.map(|(declaration, _)| declaration)
}

/// Return an iterator of (AnimatableLonghand, AnimationValue).
Expand Down

0 comments on commit b20bbea

Please sign in to comment.