const-type-layout 0.1.0

Derivable const trait to view and compare the layout of a struct, union, or enum.
Documentation

CI Status Rust Doc Crate Rust Doc Main License Status Code Coverage Gitpod Ready-to-Code

const-type-layout is a type layout comparison aid, providing a #[derive]able TypeLayout trait that reports:

  • The type's name, size, and minimum alignment
  • The type's structure, i.e. struct vs. union vs. enum
  • Each field's name and offset
  • Each variant's name and discriminant

Through the auto-implemented TypeGraphLayout trait, the deep type layout is also reported as a graph.

This crate heavily builds on the original runtime type-layout crate by Lucien Greathouse.

Examples

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,
}

println!("{:#?}", Foo::TYPE_LAYOUT);
// prints:
//
// TypeLayoutInfo {
//     name: "Foo",
//     size: 8,
//     alignment: 4,
//     structure: Struct {
//         repr: "C",
//         fields: [
//             Field {
//                 name: "a",
//                 offset: 0,
//                 ty: "u8",
//             },
//             Field {
//                 name: "b",
//                 offset: 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,
}

println!("{:#?}", OverAligned::TYPE_LAYOUT);
// prints:
//
// TypeLayoutInfo {
//     name: "OverAligned",
//     size: 128,
//     alignment: 128,
//     structure: Struct {
//         repr: "C,align(128)",
//         fields: [
//             Field {
//                 name: "value",
//                 offset: 0,
//                 ty: "u8",
//             },
//         ],
//     },
// }

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.