Skip to content

Commit

Permalink
style: Use an enumerated array for per-pseudo maps.
Browse files Browse the repository at this point in the history
This avoids random HashMaps.

MozReview-Commit-ID: LQeZrLsoOnl
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
  • Loading branch information
emilio committed Aug 8, 2017
1 parent 01cf3c5 commit 9dbf2b6
Show file tree
Hide file tree
Showing 6 changed files with 292 additions and 153 deletions.
245 changes: 164 additions & 81 deletions components/style/gecko/generated/pseudo_element_definition.rs
Expand Up @@ -175,9 +175,14 @@ pub enum PseudoElement {





/// The number of eager pseudo-elements.
pub const EAGER_PSEUDO_COUNT: usize = 4;

/// The number of non-functional pseudo-elements.
pub const SIMPLE_PSEUDO_COUNT: usize = 71;

/// The list of eager pseudos.
pub const EAGER_PSEUDOS: [PseudoElement; EAGER_PSEUDO_COUNT] = [
PseudoElement::Before,
Expand All @@ -188,88 +193,7 @@ pub const EAGER_PSEUDOS: [PseudoElement; EAGER_PSEUDO_COUNT] = [






impl PseudoElement {
/// Executes a closure with each simple (not functional)
/// pseudo-element as an argument.
pub fn each_simple<F>(mut fun: F)
where F: FnMut(Self),
{
fun(PseudoElement::After);
fun(PseudoElement::Before);
fun(PseudoElement::Backdrop);
fun(PseudoElement::Cue);
fun(PseudoElement::FirstLetter);
fun(PseudoElement::FirstLine);
fun(PseudoElement::MozSelection);
fun(PseudoElement::MozFocusInner);
fun(PseudoElement::MozFocusOuter);
fun(PseudoElement::MozListBullet);
fun(PseudoElement::MozListNumber);
fun(PseudoElement::MozMathAnonymous);
fun(PseudoElement::MozNumberWrapper);
fun(PseudoElement::MozNumberText);
fun(PseudoElement::MozNumberSpinBox);
fun(PseudoElement::MozNumberSpinUp);
fun(PseudoElement::MozNumberSpinDown);
fun(PseudoElement::MozProgressBar);
fun(PseudoElement::MozRangeTrack);
fun(PseudoElement::MozRangeProgress);
fun(PseudoElement::MozRangeThumb);
fun(PseudoElement::MozMeterBar);
fun(PseudoElement::MozPlaceholder);
fun(PseudoElement::Placeholder);
fun(PseudoElement::MozColorSwatch);
fun(PseudoElement::MozText);
fun(PseudoElement::OofPlaceholder);
fun(PseudoElement::FirstLetterContinuation);
fun(PseudoElement::MozBlockInsideInlineWrapper);
fun(PseudoElement::MozMathMLAnonymousBlock);
fun(PseudoElement::MozXULAnonymousBlock);
fun(PseudoElement::HorizontalFramesetBorder);
fun(PseudoElement::VerticalFramesetBorder);
fun(PseudoElement::MozLineFrame);
fun(PseudoElement::ButtonContent);
fun(PseudoElement::CellContent);
fun(PseudoElement::DropDownList);
fun(PseudoElement::FieldsetContent);
fun(PseudoElement::FramesetBlank);
fun(PseudoElement::MozDisplayComboboxControlFrame);
fun(PseudoElement::HtmlCanvasContent);
fun(PseudoElement::InlineTable);
fun(PseudoElement::Table);
fun(PseudoElement::TableCell);
fun(PseudoElement::TableColGroup);
fun(PseudoElement::TableCol);
fun(PseudoElement::TableWrapper);
fun(PseudoElement::TableRowGroup);
fun(PseudoElement::TableRow);
fun(PseudoElement::Canvas);
fun(PseudoElement::PageBreak);
fun(PseudoElement::Page);
fun(PseudoElement::PageContent);
fun(PseudoElement::PageSequence);
fun(PseudoElement::ScrolledContent);
fun(PseudoElement::ScrolledCanvas);
fun(PseudoElement::ScrolledPageSequence);
fun(PseudoElement::ColumnContent);
fun(PseudoElement::Viewport);
fun(PseudoElement::ViewportScroll);
fun(PseudoElement::AnonymousFlexItem);
fun(PseudoElement::AnonymousGridItem);
fun(PseudoElement::Ruby);
fun(PseudoElement::RubyBase);
fun(PseudoElement::RubyBaseContainer);
fun(PseudoElement::RubyText);
fun(PseudoElement::RubyTextContainer);
fun(PseudoElement::MozSVGMarkerAnonChild);
fun(PseudoElement::MozSVGOuterSVGAnonChild);
fun(PseudoElement::MozSVGForeignContent);
fun(PseudoElement::MozSVGText);
}

/// Get the pseudo-element as an atom.
#[inline]
pub fn atom(&self) -> Atom {
Expand Down Expand Up @@ -360,6 +284,165 @@ impl PseudoElement {
}
}

/// Returns an index if the pseudo-element is a simple (non-functional)
/// pseudo.
#[inline]
pub fn simple_index(&self) -> Option<usize> {
match *self {
PseudoElement::After => Some(0),
PseudoElement::Before => Some(1),
PseudoElement::Backdrop => Some(2),
PseudoElement::Cue => Some(3),
PseudoElement::FirstLetter => Some(4),
PseudoElement::FirstLine => Some(5),
PseudoElement::MozSelection => Some(6),
PseudoElement::MozFocusInner => Some(7),
PseudoElement::MozFocusOuter => Some(8),
PseudoElement::MozListBullet => Some(9),
PseudoElement::MozListNumber => Some(10),
PseudoElement::MozMathAnonymous => Some(11),
PseudoElement::MozNumberWrapper => Some(12),
PseudoElement::MozNumberText => Some(13),
PseudoElement::MozNumberSpinBox => Some(14),
PseudoElement::MozNumberSpinUp => Some(15),
PseudoElement::MozNumberSpinDown => Some(16),
PseudoElement::MozProgressBar => Some(17),
PseudoElement::MozRangeTrack => Some(18),
PseudoElement::MozRangeProgress => Some(19),
PseudoElement::MozRangeThumb => Some(20),
PseudoElement::MozMeterBar => Some(21),
PseudoElement::MozPlaceholder => Some(22),
PseudoElement::Placeholder => Some(23),
PseudoElement::MozColorSwatch => Some(24),
PseudoElement::MozText => Some(25),
PseudoElement::OofPlaceholder => Some(26),
PseudoElement::FirstLetterContinuation => Some(27),
PseudoElement::MozBlockInsideInlineWrapper => Some(28),
PseudoElement::MozMathMLAnonymousBlock => Some(29),
PseudoElement::MozXULAnonymousBlock => Some(30),
PseudoElement::HorizontalFramesetBorder => Some(31),
PseudoElement::VerticalFramesetBorder => Some(32),
PseudoElement::MozLineFrame => Some(33),
PseudoElement::ButtonContent => Some(34),
PseudoElement::CellContent => Some(35),
PseudoElement::DropDownList => Some(36),
PseudoElement::FieldsetContent => Some(37),
PseudoElement::FramesetBlank => Some(38),
PseudoElement::MozDisplayComboboxControlFrame => Some(39),
PseudoElement::HtmlCanvasContent => Some(40),
PseudoElement::InlineTable => Some(41),
PseudoElement::Table => Some(42),
PseudoElement::TableCell => Some(43),
PseudoElement::TableColGroup => Some(44),
PseudoElement::TableCol => Some(45),
PseudoElement::TableWrapper => Some(46),
PseudoElement::TableRowGroup => Some(47),
PseudoElement::TableRow => Some(48),
PseudoElement::Canvas => Some(49),
PseudoElement::PageBreak => Some(50),
PseudoElement::Page => Some(51),
PseudoElement::PageContent => Some(52),
PseudoElement::PageSequence => Some(53),
PseudoElement::ScrolledContent => Some(54),
PseudoElement::ScrolledCanvas => Some(55),
PseudoElement::ScrolledPageSequence => Some(56),
PseudoElement::ColumnContent => Some(57),
PseudoElement::Viewport => Some(58),
PseudoElement::ViewportScroll => Some(59),
PseudoElement::AnonymousFlexItem => Some(60),
PseudoElement::AnonymousGridItem => Some(61),
PseudoElement::Ruby => Some(62),
PseudoElement::RubyBase => Some(63),
PseudoElement::RubyBaseContainer => Some(64),
PseudoElement::RubyText => Some(65),
PseudoElement::RubyTextContainer => Some(66),
PseudoElement::MozSVGMarkerAnonChild => Some(67),
PseudoElement::MozSVGOuterSVGAnonChild => Some(68),
PseudoElement::MozSVGForeignContent => Some(69),
PseudoElement::MozSVGText => Some(70),
_ => None,
}
}

/// Returns an array of `None` values.
///
/// FIXME(emilio): Integer generics can't come soon enough.
pub fn simple_pseudo_none_array<T>() -> [Option<T>; SIMPLE_PSEUDO_COUNT] {
[
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None
]
}

/// Whether this pseudo-element is an anonymous box.
#[inline]
pub fn is_anon_box(&self) -> bool {
Expand Down
39 changes: 26 additions & 13 deletions components/style/gecko/pseudo_element_definition.mako.rs
Expand Up @@ -16,35 +16,27 @@ pub enum PseudoElement {
}

<% EAGER_PSEUDOS = ["Before", "After", "FirstLine", "FirstLetter"] %>
<% TREE_PSEUDOS = [pseudo for pseudo in PSEUDOS if pseudo.is_tree_pseudo_element()] %>
<% SIMPLE_PSEUDOS = [pseudo for pseudo in PSEUDOS if not pseudo.is_tree_pseudo_element()] %>

/// The number of eager pseudo-elements.
pub const EAGER_PSEUDO_COUNT: usize = ${len(EAGER_PSEUDOS)};

/// The number of non-functional pseudo-elements.
pub const SIMPLE_PSEUDO_COUNT: usize = ${len(SIMPLE_PSEUDOS)};

/// The list of eager pseudos.
pub const EAGER_PSEUDOS: [PseudoElement; EAGER_PSEUDO_COUNT] = [
% for eager_pseudo_name in EAGER_PSEUDOS:
PseudoElement::${eager_pseudo_name},
% endfor
];

<% TREE_PSEUDOS = [pseudo for pseudo in PSEUDOS if pseudo.is_tree_pseudo_element()] %>
<% SIMPLE_PSEUDOS = [pseudo for pseudo in PSEUDOS if not pseudo.is_tree_pseudo_element()] %>

<%def name="pseudo_element_variant(pseudo, tree_arg='..')">\
PseudoElement::${pseudo.capitalized()}${"({})".format(tree_arg) if pseudo.is_tree_pseudo_element() else ""}\
</%def>

impl PseudoElement {
/// Executes a closure with each simple (not functional)
/// pseudo-element as an argument.
pub fn each_simple<F>(mut fun: F)
where F: FnMut(Self),
{
% for pseudo in SIMPLE_PSEUDOS:
fun(${pseudo_element_variant(pseudo)});
% endfor
}

/// Get the pseudo-element as an atom.
#[inline]
pub fn atom(&self) -> Atom {
Expand All @@ -55,6 +47,27 @@ impl PseudoElement {
}
}

/// Returns an index if the pseudo-element is a simple (non-functional)
/// pseudo.
#[inline]
pub fn simple_index(&self) -> Option<usize> {
match *self {
% for i, pseudo in enumerate(SIMPLE_PSEUDOS):
${pseudo_element_variant(pseudo)} => Some(${i}),
% endfor
_ => None,
}
}

/// Returns an array of `None` values.
///
/// FIXME(emilio): Integer generics can't come soon enough.
pub fn simple_pseudo_none_array<T>() -> [Option<T>; SIMPLE_PSEUDO_COUNT] {
[
${",\n".join(["None" for pseudo in SIMPLE_PSEUDOS])}
]
}

/// Whether this pseudo-element is an anonymous box.
#[inline]
pub fn is_anon_box(&self) -> bool {
Expand Down
11 changes: 1 addition & 10 deletions components/style/gecko/selector_parser.rs
Expand Up @@ -14,7 +14,7 @@ use std::fmt;
use string_cache::{Atom, Namespace, WeakAtom, WeakNamespace};
use style_traits::{ParseError, StyleParseError};

pub use gecko::pseudo_element::{PseudoElement, EAGER_PSEUDOS, EAGER_PSEUDO_COUNT};
pub use gecko::pseudo_element::{PseudoElement, EAGER_PSEUDOS, EAGER_PSEUDO_COUNT, SIMPLE_PSEUDO_COUNT};
pub use gecko::snapshot::SnapshotMap;

bitflags! {
Expand Down Expand Up @@ -413,15 +413,6 @@ impl SelectorImpl {
}


#[inline]
/// Executes a function for each simple (not functional) pseudo-element.
pub fn each_simple_pseudo_element<F>(fun: F)
where F: FnMut(PseudoElement),
{
PseudoElement::each_simple(fun)
}

#[inline]
/// Returns the relevant state flag for a given non-tree-structural
/// pseudo-class.
pub fn pseudo_class_state_flag(pc: &NonTSPseudoClass) -> ElementState {
Expand Down

0 comments on commit 9dbf2b6

Please sign in to comment.