Struct layout_2013::construct::Legalizer

source ·
struct Legalizer {
    stack: Vec<FlowRef>,
}
Expand description

Maintains a stack of anonymous boxes needed to ensure that the flow tree is legal. The tree is legal if it follows the rules in CSS 2.1 § 17.2.1.

As an example, the legalizer makes sure that table row flows contain only table cells. If the flow constructor attempts to place, say, a block flow directly underneath the table row, the legalizer generates an anonymous table cell in between to hold the block.

Generally, the flow constructor should use Legalizer::add_child() instead of calling Flow::add_new_child() directly. This ensures that the flow tree remains legal at all times and centralizes the anonymous flow generation logic in one place.

Fields§

§stack: Vec<FlowRef>

A stack of anonymous flows that have yet to be finalized (i.e. that still could acquire new children).

Implementations§

source§

impl Legalizer

source

fn new() -> Legalizer

Creates a new legalizer.

source

fn add_child<E>( &mut self, context: &SharedStyleContext<'_>, parent: &mut FlowRef, child: FlowRef, )
where E: TElement,

Makes the child flow a new child of parent. Anonymous flows are automatically inserted to keep the tree legal.

source

fn finish(self, parent: &mut FlowRef)

Flushes all flows we’ve been gathering up.

source

fn try_to_add_child<E>( &mut self, context: &SharedStyleContext<'_>, parent: &mut FlowRef, child: &mut FlowRef, ) -> bool
where E: TElement,

Attempts to make child a child of parent. On success, this returns true. If this would make the tree illegal, this method does nothing and returns false.

This method attempts to create anonymous blocks in between parent and child if and only if those blocks will only ever have child as their sole child. At present, this is only true for anonymous block children of flex flows.

source

fn flush_top_of_stack(&mut self, parent: &mut FlowRef)

Finalizes the flow on the top of the stack.

source

fn push_next_anonymous_flow<E>( &mut self, context: &SharedStyleContext<'_>, parent: &FlowRef, )
where E: TElement,

Adds the anonymous flow that would be necessary to make an illegal child of parent legal to the stack.

source

fn push_new_anonymous_flow<E, F>( &mut self, context: &SharedStyleContext<'_>, reference: &FlowRef, pseudos: &[PseudoElement], specific_fragment_info: SpecificFragmentInfo, constructor: fn(_: Fragment) -> F, )
where E: TElement, F: Flow,

Creates an anonymous flow and pushes it onto the stack.

source

fn create_anonymous_flow<E, F>( context: &SharedStyleContext<'_>, reference: &FlowRef, pseudos: &[PseudoElement], specific_fragment_info: SpecificFragmentInfo, constructor: fn(_: Fragment) -> F, ) -> FlowRef
where E: TElement, F: Flow,

Creates a new anonymous flow. The new flow is identical to reference except with all styles applying to every pseudo-element in pseudos applied.

This method invokes the supplied constructor function on the given specific fragment info in order to actually generate the flow.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Downcast<T> for T

source§

fn downcast(&self) -> &T

source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<T> MaybeBoxed<Box<T>> for T

source§

fn maybe_boxed(self) -> Box<T>

Convert
source§

impl<T> MaybeBoxed<T> for T

source§

fn maybe_boxed(self) -> T

Convert
source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> Upcast<T> for T

source§

fn upcast(&self) -> Option<&T>

source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<T> ErasedDestructor for T
where T: 'static,

source§

impl<T> MaybeSendSync for T

source§

impl<T> WasmNotSend for T
where T: Send,

source§

impl<T> WasmNotSendSync for T

source§

impl<T> WasmNotSync for T
where T: Sync,