#const-generics #alignment #align #layout #zero-sized

no-std elain

Set a type's minimum alignment with const generics

4 releases (2 breaking)

0.3.1 Oct 17, 2024
0.3.0 Apr 13, 2021
0.2.0 Apr 8, 2021
0.1.0 Apr 8, 2021

#190 in Rust patterns

Download history 2120/week @ 2024-11-30 747/week @ 2024-12-07 877/week @ 2024-12-14 1374/week @ 2024-12-21 791/week @ 2024-12-28 1035/week @ 2025-01-04 1233/week @ 2025-01-11 1348/week @ 2025-01-18 2197/week @ 2025-01-25 3809/week @ 2025-02-01 2223/week @ 2025-02-08 3080/week @ 2025-02-15 6844/week @ 2025-02-22 8265/week @ 2025-03-01 2987/week @ 2025-03-08 4914/week @ 2025-03-15

23,315 downloads per month
Used in 15 crates (6 directly)

MIT/Apache

17KB
166 lines

Elain

Set the minimum alignments of types using const generics, rather than #[repr(align(N))].

Basic Use

The type Align<N> is a zero-sized-type with alignment equal to N:

use elain::Align;
use core::mem::{align_of, align_of_val};

assert_eq!(align_of::<Align<1>>(), 1);
assert_eq!(align_of::<Align<2>>(), 2);
assert_eq!(align_of::<Align<4>>(), 4);

const FOO_ALIGN: usize = 8;

#[repr(C)]
struct Foo {
    _align: Align<FOO_ALIGN>,
}

let foo: Foo = Foo { _align: Align::NEW };

assert_eq!(align_of_val(&foo), 8);

Valid alignments are powers of two less-than-or-equal to 228. Supplying an invalid alignment to Align is a type error:

use elain::Align;

struct Foo(Align<3>); // Compile Error

Generic Use

Because only some integers are valid alignments, supplying the alignment of a type generically requires some extra work:

use elain::Align;

struct Foo<const N: usize> {
    _align: Align<N>,
}

To resolve this error, add a where bound like so, using the Alignment trait to check that Align<N> is valid.

use elain::{Align, Alignment};
use core::mem::align_of;

struct Foo<const MIN_ALIGNMENT: usize>
where
    Align<MIN_ALIGNMENT>: Alignment
{
    _align: Align<MIN_ALIGNMENT>,
    bar: u8,
    baz: u16,
}

assert_eq!(align_of::<Foo<1>>(), 2);
assert_eq!(align_of::<Foo<2>>(), 2);
assert_eq!(align_of::<Foo<4>>(), 4);

No runtime deps