pub struct TyAndLayout<'a, Ty> {
    pub ty: Ty,
    pub layout: Layout<'a>,
}Expand description
The layout of a type, alongside the type itself. Provides various type traversal APIs (e.g., recursing into fields).
Note that the layout is NOT guaranteed to always be identical
to that obtained from layout_of(ty), as we need to produce
layouts for which Rust types do not exist, such as enum variants
or synthetic fields of enums (i.e., discriminants) and wide pointers.
Fields§
§ty: Ty§layout: Layout<'a>Implementations§
Source§impl<'a, Ty> TyAndLayout<'a, Ty>
 
impl<'a, Ty> TyAndLayout<'a, Ty>
Sourcepub fn homogeneous_aggregate<C>(
    &self,
    cx: &C,
) -> Result<HomogeneousAggregate, Heterogeneous>where
    Ty: TyAbiInterface<'a, C> + Copy,
 
pub fn homogeneous_aggregate<C>(
    &self,
    cx: &C,
) -> Result<HomogeneousAggregate, Heterogeneous>where
    Ty: TyAbiInterface<'a, C> + Copy,
Returns Homogeneous if this layout is an aggregate containing fields of
only a single type (e.g., (u32, u32)). Such aggregates are often
special-cased in ABIs.
Note: We generally ignore 1-ZST fields when computing this value (see #56877).
This is public so that it can be used in unit tests, but should generally only be relevant to the ABI details of specific targets.
Source§impl<'a, Ty> TyAndLayout<'a, Ty>
 
impl<'a, Ty> TyAndLayout<'a, Ty>
pub fn for_variant<C>(self, cx: &C, variant_index: VariantIdx) -> Selfwhere
    Ty: TyAbiInterface<'a, C>,
pub fn field<C>(self, cx: &C, i: usize) -> Selfwhere
    Ty: TyAbiInterface<'a, C>,
pub fn pointee_info_at<C>(self, cx: &C, offset: Size) -> Option<PointeeInfo>where
    Ty: TyAbiInterface<'a, C>,
pub fn is_single_fp_element<C>(self, cx: &C) -> boolwhere
    Ty: TyAbiInterface<'a, C>,
    C: HasDataLayout,
pub fn is_single_vector_element<C>(self, cx: &C, expected_size: Size) -> boolwhere
    Ty: TyAbiInterface<'a, C>,
    C: HasDataLayout,
pub fn is_adt<C>(self) -> boolwhere
    Ty: TyAbiInterface<'a, C>,
pub fn is_never<C>(self) -> boolwhere
    Ty: TyAbiInterface<'a, C>,
pub fn is_tuple<C>(self) -> boolwhere
    Ty: TyAbiInterface<'a, C>,
pub fn is_unit<C>(self) -> boolwhere
    Ty: TyAbiInterface<'a, C>,
pub fn is_transparent<C>(self) -> boolwhere
    Ty: TyAbiInterface<'a, C>,
Sourcepub fn non_1zst_field<C>(&self, cx: &C) -> Option<(FieldIdx, Self)>where
    Ty: TyAbiInterface<'a, C> + Copy,
 
pub fn non_1zst_field<C>(&self, cx: &C) -> Option<(FieldIdx, Self)>where
    Ty: TyAbiInterface<'a, C> + Copy,
Finds the one field that is not a 1-ZST.
Returns None if there are multiple non-1-ZST fields or only 1-ZST-fields.
Methods from Deref<Target = &'a LayoutData<FieldIdx, VariantIdx>>§
Sourcepub fn is_aggregate(&self) -> bool
 
pub fn is_aggregate(&self) -> bool
Returns true if this is an aggregate type (including a ScalarPair!)
Sourcepub fn is_uninhabited(&self) -> bool
 
pub fn is_uninhabited(&self) -> bool
Returns true if this is an uninhabited type
Sourcepub fn is_unsized(&self) -> bool
 
pub fn is_unsized(&self) -> bool
Returns true if the layout corresponds to an unsized type.
pub fn is_sized(&self) -> bool
Sourcepub fn is_1zst(&self) -> bool
 
pub fn is_1zst(&self) -> bool
Returns true if the type is sized and a 1-ZST (meaning it has size 0 and alignment 1).
Sourcepub fn is_zst(&self) -> bool
 
pub fn is_zst(&self) -> bool
Returns true if the type is a ZST and not unsized.
Note that this does not imply that the type is irrelevant for layout! It can still have
non-trivial alignment constraints. You probably want to use is_1zst instead.
Sourcepub fn eq_abi(&self, other: &Self) -> bool
 
pub fn eq_abi(&self, other: &Self) -> bool
Checks if these two Layout are equal enough to be considered “the same for all function
call ABIs”. Note however that real ABIs depend on more details that are not reflected in the
Layout; the PassMode need to be compared as well. Also note that we assume
aggregates are passed via PassMode::Indirect or PassMode::Cast; more strict
checks would otherwise be required.
Trait Implementations§
Source§impl<'a, Ty> AsRef<LayoutData<FieldIdx, VariantIdx>> for TyAndLayout<'a, Ty>
 
impl<'a, Ty> AsRef<LayoutData<FieldIdx, VariantIdx>> for TyAndLayout<'a, Ty>
Source§fn as_ref(&self) -> &LayoutData<FieldIdx, VariantIdx>
 
fn as_ref(&self) -> &LayoutData<FieldIdx, VariantIdx>
Source§impl<'a, Ty: Clone> Clone for TyAndLayout<'a, Ty>
 
impl<'a, Ty: Clone> Clone for TyAndLayout<'a, Ty>
Source§fn clone(&self) -> TyAndLayout<'a, Ty>
 
fn clone(&self) -> TyAndLayout<'a, Ty>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
 
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<'a, Ty: Display> Debug for TyAndLayout<'a, Ty>
 
impl<'a, Ty: Display> Debug for TyAndLayout<'a, Ty>
Source§impl<'a, Ty> Deref for TyAndLayout<'a, Ty>
 
impl<'a, Ty> Deref for TyAndLayout<'a, Ty>
Source§type Target = &'a LayoutData<FieldIdx, VariantIdx>
 
type Target = &'a LayoutData<FieldIdx, VariantIdx>
Source§fn deref(&self) -> &&'a LayoutData<FieldIdx, VariantIdx>
 
fn deref(&self) -> &&'a LayoutData<FieldIdx, VariantIdx>
Source§impl<'a, Ty: Hash> Hash for TyAndLayout<'a, Ty>
 
impl<'a, Ty: Hash> Hash for TyAndLayout<'a, Ty>
Source§impl<'a, Ty, __CTX> HashStable<__CTX> for TyAndLayout<'a, Ty>where
    __CTX: HashStableContext,
    Ty: HashStable<__CTX>,
 
impl<'a, Ty, __CTX> HashStable<__CTX> for TyAndLayout<'a, Ty>where
    __CTX: HashStableContext,
    Ty: HashStable<__CTX>,
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
Source§impl<'a, Ty: PartialEq> PartialEq for TyAndLayout<'a, Ty>
 
impl<'a, Ty: PartialEq> PartialEq for TyAndLayout<'a, Ty>
impl<'a, Ty: Copy> Copy for TyAndLayout<'a, Ty>
impl<'a, Ty: Eq> Eq for TyAndLayout<'a, Ty>
impl<'a, Ty> StructuralPartialEq for TyAndLayout<'a, Ty>
Auto Trait Implementations§
impl<'a, Ty> DynSend for TyAndLayout<'a, Ty>where
    Ty: DynSend,
impl<'a, Ty> DynSync for TyAndLayout<'a, Ty>where
    Ty: DynSync,
impl<'a, Ty> Freeze for TyAndLayout<'a, Ty>where
    Ty: Freeze,
impl<'a, Ty> RefUnwindSafe for TyAndLayout<'a, Ty>where
    Ty: RefUnwindSafe,
impl<'a, Ty> Send for TyAndLayout<'a, Ty>where
    Ty: Send,
impl<'a, Ty> Sync for TyAndLayout<'a, Ty>where
    Ty: Sync,
impl<'a, Ty> Unpin for TyAndLayout<'a, Ty>where
    Ty: Unpin,
impl<'a, Ty> UnwindSafe for TyAndLayout<'a, Ty>where
    Ty: UnwindSafe,
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,
Source§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
 
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
 
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
 
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> 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 moreSource§impl<T> Pointable for T
 
impl<T> Pointable for T
Source§impl<T> WithSubscriber for T
 
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
 
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
 
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<T> ErasedDestructor for Twhere
    T: 'static,
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.