rt 0.19.0

A real-time operating system capable of full preemption
Documentation
#[derive(Clone, Copy, Default, Eq, Ord, PartialEq, PartialOrd)]
#[repr(transparent)]
pub struct Align<const N: usize>([<Self as ValidAlignment>::Unit; 0])
where
    Self: ValidAlignment;

impl<const N: usize> Align<N>
where
    Self: ValidAlignment,
{
    pub const fn new() -> Self {
        Self([])
    }
}

pub trait ValidAlignment {
    type Unit: Clone + Copy + Default + Eq + Ord + PartialEq + PartialOrd;
}

macro_rules! valid_alignment {
    ($name: ident, $x: literal) => {
        #[derive(Clone, Copy, Default, Eq, Ord, PartialEq, PartialOrd)]
        #[repr(align($x))]
        pub struct $name(());

        impl ValidAlignment for Align<$x> {
            type Unit = $name;
        }
    };
}

valid_alignment!(P2Align0, 1);
valid_alignment!(P2Align1, 2);
valid_alignment!(P2Align2, 4);
valid_alignment!(P2Align3, 8);
valid_alignment!(P2Align4, 16);
valid_alignment!(P2Align5, 32);
valid_alignment!(P2Align6, 64);
valid_alignment!(P2Align7, 128);
valid_alignment!(P2Align8, 256);
valid_alignment!(P2Align9, 512);
valid_alignment!(P2Align10, 1024);
valid_alignment!(P2Align11, 2048);
valid_alignment!(P2Align12, 4096);
valid_alignment!(P2Align13, 8192);
valid_alignment!(P2Align14, 16384);
valid_alignment!(P2Align15, 32768);
valid_alignment!(P2Align16, 65536);
valid_alignment!(P2Align17, 131072);
valid_alignment!(P2Align18, 262144);
valid_alignment!(P2Align19, 524288);
valid_alignment!(P2Align20, 1048576);
valid_alignment!(P2Align21, 2097152);
valid_alignment!(P2Align22, 4194304);
valid_alignment!(P2Align23, 8388608);
valid_alignment!(P2Align24, 16777216);
valid_alignment!(P2Align25, 33554432);
valid_alignment!(P2Align26, 67108864);
valid_alignment!(P2Align27, 134217728);
valid_alignment!(P2Align28, 268435456);
valid_alignment!(P2Align29, 536870912);

#[cfg(test)]
mod tests {
    use core::mem::align_of;

    use crate::align::Align;

    #[test]
    fn test_align() {
        assert!(align_of::<Align::<16>>() == 16);
    }

    const fn foo(x: usize) -> usize {
        x * 2
    }

    #[test]
    fn test_const_fn_align() {
        assert!(align_of::<Align::<{ foo(256) }>>() == 512);
    }
}