struct Matrix<'a, 'p, Cx: TypeCx> {
    rows: Vec<MatrixRow<'a, 'p, Cx>>,
    wildcard_row: PatStack<'a, 'p, Cx>,
    place_validity: SmallVec<[ValidityConstraint; 2]>,
}
Expand description

A 2D matrix. Represents a list of pattern-tuples under investigation.

Invariant: each row must have the same length, and each column must have the same type.

Invariant: the first column must not contain or-patterns. This is handled by Matrix::expand_and_push.

In fact each column corresponds to a place inside the scrutinee of the match. E.g. after specializing (,) and Some on a pattern of type (Option<u32>, bool), the first column of the matrix will correspond to scrutinee.0.Some.0 and the second column to scrutinee.1.

Fields§

§rows: Vec<MatrixRow<'a, 'p, Cx>>

Vector of rows. The rows must form a rectangular 2D array. Moreover, all the patterns of each column must have the same type. Each column corresponds to a place within the scrutinee.

§wildcard_row: PatStack<'a, 'p, Cx>

Stores an extra fictitious row full of wildcards. Mostly used to keep track of the type of each column. This must obey the same invariants as the real rows.

§place_validity: SmallVec<[ValidityConstraint; 2]>

Track for each column/place whether it contains a known valid value.

Implementations§

source§

impl<'a, 'p, Cx: TypeCx> Matrix<'a, 'p, Cx>

source

fn expand_and_push(&mut self, row: MatrixRow<'a, 'p, Cx>)

Pushes a new row to the matrix. If the row starts with an or-pattern, this recursively expands it. Internal method, prefer Matrix::new.

source

fn new( wildcard_arena: &'a TypedArena<DeconstructedPat<'p, Cx>>, arms: &'a [MatchArm<'p, Cx>], scrut_ty: Cx::Ty, scrut_validity: ValidityConstraint ) -> Self

Build a new matrix from an iterator of MatchArms.

source

fn head_ty(&self) -> Option<Cx::Ty>

source

fn column_count(&self) -> usize

source

fn rows<'b>( &'b self ) -> impl Iterator<Item = &'b MatrixRow<'a, 'p, Cx>> + Clone + DoubleEndedIterator + ExactSizeIterator

source

fn rows_mut<'b>( &'b mut self ) -> impl Iterator<Item = &'b mut MatrixRow<'a, 'p, Cx>> + DoubleEndedIterator + ExactSizeIterator

source

fn heads<'b>( &'b self ) -> impl Iterator<Item = &'b DeconstructedPat<'p, Cx>> + Clone + Captures<'a>

Iterate over the first pattern of each row.

source

fn specialize_constructor( &self, pcx: &PlaceCtxt<'a, 'p, Cx>, ctor: &Constructor<Cx> ) -> Matrix<'a, 'p, Cx>

This computes specialize(ctor, self). See top of the file for explanations.

Trait Implementations§

source§

impl<'a, 'p, Cx: Clone + TypeCx> Clone for Matrix<'a, 'p, Cx>

source§

fn clone(&self) -> Matrix<'a, 'p, Cx>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a, 'p, Cx: TypeCx> Debug for Matrix<'a, 'p, Cx>

Pretty-printer for matrices of patterns, example:

+ _     + []                +
+ true  + [First]           +
+ true  + [Second(true)]    +
+ false + [_]               +
+ _     + [_, _, tail @ ..] +
| ✓     | ?                 | // column validity
source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, 'p, Cx> !RefUnwindSafe for Matrix<'a, 'p, Cx>

§

impl<'a, 'p, Cx> !Send for Matrix<'a, 'p, Cx>

§

impl<'a, 'p, Cx> !Sync for Matrix<'a, 'p, Cx>

§

impl<'a, 'p, Cx> Unpin for Matrix<'a, 'p, Cx>

§

impl<'a, 'p, Cx> !UnwindSafe for Matrix<'a, 'p, Cx>

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> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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<'a, T> Captures<'a> for T
where T: ?Sized,

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 72 bytes