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_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<(usize, Self)>where
Ty: TyAbiInterface<'a, C> + Copy,
pub fn non_1zst_field<C>(&self, cx: &C) -> Option<(usize, 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 LayoutS<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_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: 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>
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§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§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)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§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<'a, T> Captures<'a> for Twhere
T: ?Sized,
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.