//! Intermediate representation for the physical layout of some type.
usesuper::derive::CanDerive; usesuper::ty::{Type, TypeKind, RUST_DERIVE_IN_ARRAY_LIMIT}; usecrate::clang; usecrate::ir::context::BindgenContext; use std::cmp;
/// A type that represents the struct layout of a type. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub(crate) struct Layout { /// The size (in bytes) of this layout. pub(crate) size: usize, /// The alignment (in bytes) of this layout. pub(crate) align: usize, /// Whether this layout's members are packed or not. pub(crate) packed: bool,
}
impl Layout { /// Gets the integer type name for a given known size. pub(crate) fn known_type_for_size(
ctx: &BindgenContext,
size: usize,
) -> Option<syn::Type> {
Some(match size { 16if ctx.options().rust_features.i128_and_u128 => {
syn::parse_quote! { u128 }
} 8 => syn::parse_quote! { u64 }, 4 => syn::parse_quote! { u32 }, 2 => syn::parse_quote! { u16 }, 1 => syn::parse_quote! { u8 },
_ => return None,
})
}
/// Construct a new `Layout` with the given `size` and `align`. It is not /// packed. pub(crate) fn new(size: usize, align: usize) -> Self {
Layout {
size,
align,
packed: false,
}
}
/// Creates a non-packed layout for a given size, trying to use the maximum /// alignment possible. pub(crate) fn for_size(ctx: &BindgenContext, size: usize) -> Self { Self::for_size_internal(ctx.target_pointer_size(), size)
}
/// Get this layout as an opaque type. pub(crate) fn opaque(&self) -> Opaque {
Opaque(*self)
}
}
/// When we are treating a type as opaque, it is just a blob with a `Layout`. #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) struct Opaque(pub(crate) Layout);
impl Opaque { /// Construct a new opaque type from the given clang type. pub(crate) fn from_clang_ty(
ty: &clang::Type,
ctx: &BindgenContext,
) -> Type { let layout = Layout::new(ty.size(ctx), ty.align(ctx)); let ty_kind = TypeKind::Opaque; let is_const = ty.is_const(); Type::new(None, Some(layout), ty_kind, is_const)
}
/// Return the known rust type we should use to create a correctly-aligned /// field with this layout. pub(crate) fn known_rust_type_for_array(
&self,
ctx: &BindgenContext,
) -> Option<syn::Type> {
Layout::known_type_for_size(ctx, self.0.align)
}
/// Return the array size that an opaque type for this layout should have if /// we know the correct type for it, or `None` otherwise. pub(crate) fn array_size(&self, ctx: &BindgenContext) -> Option<usize> { ifself.known_rust_type_for_array(ctx).is_some() {
Some(self.0.size / cmp::max(self.0.align, 1))
} else {
None
}
}
/// Return `true` if this opaque layout's array size will fit within the /// maximum number of array elements that Rust allows deriving traits /// with. Return `false` otherwise. pub(crate) fn array_size_within_derive_limit(
&self,
ctx: &BindgenContext,
) -> CanDerive { ifself
.array_size(ctx)
.map_or(false, |size| size <= RUST_DERIVE_IN_ARRAY_LIMIT)
{
CanDerive::Yes
} else {
CanDerive::Manually
}
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.