ialloc/align/
alignn.rs

1use core::mem::MaybeUninit;
2
3/// Wrap a value in constant-driven alignment.
4///
5/// `A` must generally be a power of 2 less than 1 GiB (`rustc` doesn't like `#[repr(align(1 GiB+))]` at this time.)
6///
7/// Note that the size will typically be rounded up to the nearest multiple of `A` (which might be `0` if `T` is a ZST.)
8#[derive(Clone, Copy, Debug)] #[repr(C)] pub struct AlignN<const A : usize, T> where [(); A] : ValidAlignLessThan1GiB {
9    align: MaybeUninit<<[(); A] as ValidAlignLessThan1GiB>::Align>,
10    value: T,
11}
12
13#[allow(dead_code)] impl<const A : usize, T> AlignN<A, T> where [(); A] : _align_impl::ValidAlignLessThan1GiB {
14    pub const fn new(value: T) -> Self { Self { value, align: MaybeUninit::uninit() } }
15    pub fn into_inner(self) -> T { self.value }
16}
17
18impl<const A : usize, T> core::ops::Deref for AlignN<A, T> where [(); A] : _align_impl::ValidAlignLessThan1GiB {
19    type Target = T;
20    fn deref(&self) -> &Self::Target { &self.value }
21}
22
23impl<const A : usize, T> core::ops::DerefMut for AlignN<A, T> where [(); A] : _align_impl::ValidAlignLessThan1GiB {
24    fn deref_mut(&mut self) -> &mut Self::Target { &mut self.value }
25}
26
27impl<const A : usize, T: Default> Default for AlignN<A, T> where [(); A] : _align_impl::ValidAlignLessThan1GiB {
28    fn default() -> Self { Self { value: Default::default(), align: MaybeUninit::uninit() } }
29}
30
31impl<const A : usize, T> From<T> for AlignN<A, T> where [(); A] : _align_impl::ValidAlignLessThan1GiB {
32    fn from(value: T) -> Self { Self { value, align: MaybeUninit::uninit() } }
33}
34
35
36
37use _align_impl::*;
38#[doc(hidden)] pub mod _align_impl {
39    pub trait ValidAlignLessThan1GiB {
40        #[doc(hidden)] type Align : Clone + Copy + Default + core::fmt::Debug + PartialEq + Eq + PartialOrd + Ord + core::hash::Hash;
41    }
42
43    impl ValidAlignLessThan1GiB for [();         1] { type Align = Align1; }
44    impl ValidAlignLessThan1GiB for [();         2] { type Align = Align2; }
45    impl ValidAlignLessThan1GiB for [();         4] { type Align = Align4; }
46    impl ValidAlignLessThan1GiB for [();         8] { type Align = Align8; }
47    impl ValidAlignLessThan1GiB for [();        16] { type Align = Align16; }
48    impl ValidAlignLessThan1GiB for [();        32] { type Align = Align32; }
49    impl ValidAlignLessThan1GiB for [();        64] { type Align = Align64; }
50    impl ValidAlignLessThan1GiB for [();       128] { type Align = Align128; }
51    impl ValidAlignLessThan1GiB for [();       256] { type Align = Align256; }
52    impl ValidAlignLessThan1GiB for [();       512] { type Align = Align512; }
53    impl ValidAlignLessThan1GiB for [();      1024] { type Align = Align1024; }
54    impl ValidAlignLessThan1GiB for [();      2048] { type Align = Align2048; }
55    impl ValidAlignLessThan1GiB for [();      4096] { type Align = Align4096; }
56    impl ValidAlignLessThan1GiB for [();      8192] { type Align = Align8192; }
57    impl ValidAlignLessThan1GiB for [();     16384] { type Align = Align16384; }
58    impl ValidAlignLessThan1GiB for [();     32768] { type Align = Align32768; }
59    impl ValidAlignLessThan1GiB for [();     65536] { type Align = Align65536; }
60    impl ValidAlignLessThan1GiB for [();    131072] { type Align = Align131072; }
61    impl ValidAlignLessThan1GiB for [();    262144] { type Align = Align262144; }
62    impl ValidAlignLessThan1GiB for [();    524288] { type Align = Align524288; }
63    impl ValidAlignLessThan1GiB for [();   1048576] { type Align = Align1048576; }
64    impl ValidAlignLessThan1GiB for [();   2097152] { type Align = Align2097152; }
65    impl ValidAlignLessThan1GiB for [();   4194304] { type Align = Align4194304; }
66    impl ValidAlignLessThan1GiB for [();   8388608] { type Align = Align8388608; }
67    impl ValidAlignLessThan1GiB for [();  16777216] { type Align = Align16777216; }
68    impl ValidAlignLessThan1GiB for [();  33554432] { type Align = Align33554432; }
69    impl ValidAlignLessThan1GiB for [();  67108864] { type Align = Align67108864; }
70    impl ValidAlignLessThan1GiB for [(); 134217728] { type Align = Align134217728; }
71    impl ValidAlignLessThan1GiB for [(); 268435456] { type Align = Align268435456; }
72    impl ValidAlignLessThan1GiB for [(); 536870912] { type Align = Align536870912; }
73
74    pub trait ByAlign<const A : usize> where Self : Sized {
75        #[doc(hidden)] type Align : Clone + Copy + Default + core::fmt::Debug + PartialEq + Eq + PartialOrd + Ord + core::hash::Hash;
76    }
77
78    impl ByAlign<        1> for () { type Align = Align1; }
79    impl ByAlign<        2> for () { type Align = Align2; }
80    impl ByAlign<        4> for () { type Align = Align4; }
81    impl ByAlign<        8> for () { type Align = Align8; }
82    impl ByAlign<       16> for () { type Align = Align16; }
83    impl ByAlign<       32> for () { type Align = Align32; }
84    impl ByAlign<       64> for () { type Align = Align64; }
85    impl ByAlign<      128> for () { type Align = Align128; }
86    impl ByAlign<      256> for () { type Align = Align256; }
87    impl ByAlign<      512> for () { type Align = Align512; }
88    impl ByAlign<     1024> for () { type Align = Align1024; }
89    impl ByAlign<     2048> for () { type Align = Align2048; }
90    impl ByAlign<     4096> for () { type Align = Align4096; }
91    impl ByAlign<     8192> for () { type Align = Align8192; }
92    impl ByAlign<    16384> for () { type Align = Align16384; }
93    impl ByAlign<    32768> for () { type Align = Align32768; }
94    impl ByAlign<    65536> for () { type Align = Align65536; }
95    impl ByAlign<   131072> for () { type Align = Align131072; }
96    impl ByAlign<   262144> for () { type Align = Align262144; }
97    impl ByAlign<   524288> for () { type Align = Align524288; }
98    impl ByAlign<  1048576> for () { type Align = Align1048576; }
99    impl ByAlign<  2097152> for () { type Align = Align2097152; }
100    impl ByAlign<  4194304> for () { type Align = Align4194304; }
101    impl ByAlign<  8388608> for () { type Align = Align8388608; }
102    impl ByAlign< 16777216> for () { type Align = Align16777216; }
103    impl ByAlign< 33554432> for () { type Align = Align33554432; }
104    impl ByAlign< 67108864> for () { type Align = Align67108864; }
105    impl ByAlign<134217728> for () { type Align = Align134217728; }
106    impl ByAlign<268435456> for () { type Align = Align268435456; }
107    impl ByAlign<536870912> for () { type Align = Align536870912; }
108
109    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(        1))] pub struct Align1; // 1 B
110    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(        2))] pub struct Align2;
111    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(        4))] pub struct Align4;
112    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(        8))] pub struct Align8;
113    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(       16))] pub struct Align16;
114    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(       32))] pub struct Align32;
115    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(       64))] pub struct Align64;
116    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(      128))] pub struct Align128;
117    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(      256))] pub struct Align256;
118    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(      512))] pub struct Align512;
119    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(     1024))] pub struct Align1024; // 1 KiB
120    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(     2048))] pub struct Align2048;
121    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(     4096))] pub struct Align4096;
122    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(     8192))] pub struct Align8192;
123    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(    16384))] pub struct Align16384;
124    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(    32768))] pub struct Align32768;
125    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(    65536))] pub struct Align65536;
126    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(   131072))] pub struct Align131072;
127    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(   262144))] pub struct Align262144;
128    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(   524288))] pub struct Align524288;
129    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(  1048576))] pub struct Align1048576; // 1 MiB
130    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(  2097152))] pub struct Align2097152;
131    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(  4194304))] pub struct Align4194304;
132    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(  8388608))] pub struct Align8388608;
133    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align( 16777216))] pub struct Align16777216;
134    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align( 33554432))] pub struct Align33554432;
135    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align( 67108864))] pub struct Align67108864;
136    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(134217728))] pub struct Align134217728;
137    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(268435456))] pub struct Align268435456;
138    #[derive(Clone, Copy, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[repr(C, align(536870912))] pub struct Align536870912;
139    // error[E0589]: invalid `repr(align)` attribute: larger than 2^29
140    //#[derive(Clone, Copy, Default)] #[repr(C, align(1073741824))] pub struct Align1073741824; // 1 GiB
141}