linera_witty/memory_layout/
layout.rs1use frunk::{hlist::HList, HCons, HNil};
7
8use super::{element::LayoutElement, FlatLayout};
9use crate::primitive_types::MaybeFlatType;
10
11pub trait Sealed {}
13
14pub trait Layout: Sealed + HList {
16 const ALIGNMENT: u32;
18
19 type Flat: FlatLayout;
21
22 fn flatten(self) -> Self::Flat;
26}
27
28impl Sealed for HNil {}
29impl<Head, Tail> Sealed for HCons<Head, Tail>
30where
31 Head: LayoutElement,
32 Tail: Layout,
33{
34}
35
36impl Layout for HNil {
37 const ALIGNMENT: u32 = 1;
38
39 type Flat = HNil;
40
41 fn flatten(self) -> Self::Flat {
42 HNil
43 }
44}
45
46impl<Head, Tail> Layout for HCons<Head, Tail>
47where
48 Head: LayoutElement,
49 Tail: Layout,
50{
51 const ALIGNMENT: u32 = if Head::ALIGNMENT > Tail::ALIGNMENT {
52 Head::ALIGNMENT
53 } else {
54 Tail::ALIGNMENT
55 };
56
57 type Flat = <Head::Flat as MaybeFlatType>::Flatten<Tail>;
58
59 fn flatten(self) -> Self::Flat {
60 self.head.flatten().flatten(self.tail)
61 }
62}