const-type-layout
is a type layout comparison aid, providing a
#[derive]
able TypeLayout
trait
that provides a const TypeLayoutInfo
struct containing:
The auto-implemented TypeGraphLayout
trait also provides a const
TypeLayoutGraph
struct that describes the deep type layout, including
the layouts of all the types mentioned by this type, e.g. in its fields.
This crate heavily builds on the original runtime type-layout crate by Lucien Greathouse.
The layout of types is only defined if they’re #[repr(C)]
. This crate works
on non-#[repr(C)]
types, but their layout is unpredictable.
use const_type_layout::TypeLayout;
#[derive(TypeLayout)]
#[repr(C)]
struct Foo {
a: u8,
b: u32,
}
assert_eq!(
format!("{:#?}", Foo::TYPE_LAYOUT),
r#"TypeLayoutInfo {
name: "rust_out::main::_doctest_main_src_lib_rs_45_0::Foo",
size: 8,
alignment: 4,
structure: Struct {
repr: "C",
fields: [
Field {
name: "a",
offset: Inhabited(
0,
),
ty: "u8",
},
Field {
name: "b",
offset: Inhabited(
4,
),
ty: "u32",
},
],
},
}"#
)
Over-aligned types have trailing padding, which can be a source of bugs in some FFI scenarios:
use const_type_layout::TypeLayout;
#[derive(TypeLayout)]
#[repr(C, align(128))]
struct OverAligned {
value: u8,
}
assert_eq!(
format!("{:#?}", OverAligned::TYPE_LAYOUT),
r#"TypeLayoutInfo {
name: "rust_out::main::_doctest_main_src_lib_rs_88_0::OverAligned",
size: 128,
alignment: 128,
structure: Struct {
repr: "C,align(128)",
fields: [
Field {
name: "value",
offset: Inhabited(
0,
),
ty: "u8",
},
],
},
}"#
)
crate::TypeLayout
are inhabited or uninhabited.Discriminant
from its constant value.TypeLayoutGraph
using the provided seed
.TypeLayoutGraph
into an array of bytes of length
serialised_type_graph_len
.TypeLayoutGraph
serialises
into.derive
#[derive(TypeLayout)]
implementation for the
const_type_layout::TypeLayout
trait.