pub struct Layout {
pub size: Size,
pub align: Size,
pub discriminator: Option<Discriminator>,
pub inhabited: InhabitedPredicate,
pub variant_layouts: IndexVec<VariantId, Option<VariantLayout>>,
pub repr: ReprOptions,
}Expand description
Type layout information.
Does not include information about niches. If the type does not have a fully known layout (e.g. it is ?Sized) some of the layout parts are not available.
Fields§
§size: SizeThe size of the type in bytes.
align: SizeThe alignment, in bytes.
discriminator: Option<Discriminator>Decision tree that determines the active variant by reading memory. Only Some for enums.
inhabited: InhabitedPredicateWhether the type has any valid value.
Note that uninhabited types can have arbitrary layouts: (u32, !) has space for the u32
and enum E2 { A, B(!), C(i32, !) } may have space for a discriminant.
variant_layouts: IndexVec<VariantId, Option<VariantLayout>>Map from VariantId to the corresponding field layouts. Some variants don’t have a
meaningful layout due to being uninhabited (though an uninhabited variant may have a
layout). Structs and unions are modeled as having exactly one variant.
repr: ReprOptionsThe representation options of this type declaration as annotated by the user.
Implementations§
Source§impl Layout
impl Layout
Sourcepub fn for_type(
krate: &TranslatedCrate,
kind: &TypeDeclKind,
repr: ReprOptions,
) -> Option<Self>
pub fn for_type( krate: &TranslatedCrate, kind: &TypeDeclKind, repr: ReprOptions, ) -> Option<Self>
Construct a layout for this type. The returned layout contains no size-related information.
pub fn is_variant_always_uninhabited(&self, variant_id: VariantId) -> bool
pub fn is_variant_always_inhabited(&self, variant_id: VariantId) -> bool
pub fn is_c_repr(&self) -> bool
Trait Implementations§
Source§impl AstVisitable for Layout
impl AstVisitable for Layout
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
fn drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
self, in pre-order traversal.Source§impl<'de, __State: ?Sized> DeserializeState<'de, __State> for Layoutwhere
Size: DeserializeState<'de, __State>,
Option<Discriminator>: DeserializeState<'de, __State>,
InhabitedPredicate: DeserializeState<'de, __State>,
IndexVec<VariantId, Option<VariantLayout>>: DeserializeState<'de, __State>,
ReprOptions: Deserialize<'de>,
impl<'de, __State: ?Sized> DeserializeState<'de, __State> for Layoutwhere
Size: DeserializeState<'de, __State>,
Option<Discriminator>: DeserializeState<'de, __State>,
InhabitedPredicate: DeserializeState<'de, __State>,
IndexVec<VariantId, Option<VariantLayout>>: DeserializeState<'de, __State>,
ReprOptions: Deserialize<'de>,
fn deserialize_state<__D>(
__state: &__State,
__deserializer: __D,
) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'s, V> Drive<'s, V> for Layoutwhere
V: Visitor + Visit<'s, Size> + Visit<'s, Option<Discriminator>> + Visit<'s, InhabitedPredicate> + Visit<'s, IndexVec<VariantId, Option<VariantLayout>>> + Visit<'s, ReprOptions>,
impl<'s, V> Drive<'s, V> for Layoutwhere
V: Visitor + Visit<'s, Size> + Visit<'s, Option<Discriminator>> + Visit<'s, InhabitedPredicate> + Visit<'s, IndexVec<VariantId, Option<VariantLayout>>> + Visit<'s, ReprOptions>,
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveMut<'s, V> for Layoutwhere
V: Visitor + VisitMut<'s, Size> + VisitMut<'s, Option<Discriminator>> + VisitMut<'s, InhabitedPredicate> + VisitMut<'s, IndexVec<VariantId, Option<VariantLayout>>> + VisitMut<'s, ReprOptions>,
impl<'s, V> DriveMut<'s, V> for Layoutwhere
V: Visitor + VisitMut<'s, Size> + VisitMut<'s, Option<Discriminator>> + VisitMut<'s, InhabitedPredicate> + VisitMut<'s, IndexVec<VariantId, Option<VariantLayout>>> + VisitMut<'s, ReprOptions>,
Source§fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl<'s, V> DriveTwo<'s, V> for Layoutwhere
V: Visitor<Break: Default> + VisitTwo<'s, Size> + VisitTwo<'s, Option<Discriminator>> + VisitTwo<'s, InhabitedPredicate> + VisitTwo<'s, IndexVec<VariantId, Option<VariantLayout>>> + VisitTwo<'s, ReprOptions>,
impl<'s, V> DriveTwo<'s, V> for Layoutwhere
V: Visitor<Break: Default> + VisitTwo<'s, Size> + VisitTwo<'s, Option<Discriminator>> + VisitTwo<'s, InhabitedPredicate> + VisitTwo<'s, IndexVec<VariantId, Option<VariantLayout>>> + VisitTwo<'s, ReprOptions>,
Source§fn drive_two_inner(
&'s self,
other: &'s Self,
visitor: &mut V,
) -> ControlFlow<V::Break>
fn drive_two_inner( &'s self, other: &'s Self, visitor: &mut V, ) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self and other, if they correspond. If
the values don’t match up, this returns Break(Default::default()).Source§impl<C: AstFormatter> FmtWithCtx<C> for Layout
impl<C: AstFormatter> FmtWithCtx<C> for Layout
Source§impl<__State: ?Sized> SerializeState<__State> for Layoutwhere
Size: SerializeState<__State>,
Option<Discriminator>: SerializeState<__State>,
InhabitedPredicate: SerializeState<__State>,
IndexVec<VariantId, Option<VariantLayout>>: SerializeState<__State>,
ReprOptions: Serialize,
impl<__State: ?Sized> SerializeState<__State> for Layoutwhere
Size: SerializeState<__State>,
Option<Discriminator>: SerializeState<__State>,
InhabitedPredicate: SerializeState<__State>,
IndexVec<VariantId, Option<VariantLayout>>: SerializeState<__State>,
ReprOptions: Serialize,
fn serialize_state<__S>(
&self,
__state: &__State,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for Layout
impl RefUnwindSafe for Layout
impl Send for Layout
impl Sync for Layout
impl Unpin for Layout
impl UnsafeUnpin for Layout
impl UnwindSafe for Layout
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreimpl<T> Mappable for T
Source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
Source§fn visit_vars(&mut self, v: &mut impl VarsVisitor)
fn visit_vars(&mut self, v: &mut impl VarsVisitor)
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen De Bruijn indices
will count from the outside of self.Source§fn substitute(self, generics: &GenericArgs) -> Self
fn substitute(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
Note: if self is an item that comes from a TraitDecl, you must use
substitute_with_self or substitute_inner_binder, otherwise you’ll get panics.Source§fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
This is appropriate when substituting an inner binder.Source§fn substitute_explicits(self, generics: &GenericArgs) -> Self
fn substitute_explicits(self, generics: &GenericArgs) -> Self
Source§fn substitute_with_self(
self,
generics: &GenericArgs,
self_ref: &TraitRefKind,
) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
TraitRefKind::SelfId trait ref.Source§fn substitute_with_tref(self, tref: &TraitRef) -> Self
fn substitute_with_tref(self, tref: &TraitRef) -> Self
TraitRefKind::SelfId trait ref.Source§fn try_substitute_with_tref(
self,
tref: &TraitRef,
) -> Result<Self, GenericsMismatch>
fn try_substitute_with_tref( self, tref: &TraitRef, ) -> Result<Self, GenericsMismatch>
TraitRefKind::SelfId trait ref.fn try_substitute( self, generics: &GenericArgs, ) -> Result<Self, GenericsMismatch>
fn try_substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Result<Self, GenericsMismatch>
Source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
depth binders.Source§fn move_from_under_binder(self) -> Option<Self>
fn move_from_under_binder(self) -> Option<Self>
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
depth binders. Returns None if it contains a variable bound in
one of these depth binders.Source§fn visit_db_id<B>(
&mut self,
f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>,
) -> ControlFlow<B>
fn visit_db_id<B>( &mut self, f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>, ) -> ControlFlow<B>
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen indices will count
from the outside of self.