1use crate::MapletResult;
6
7#[derive(Debug, Clone)]
9pub struct LayoutOptimizer {
10 cache_line_size: usize,
12 use_interleaved: bool,
14}
15
16impl LayoutOptimizer {
17 pub fn new(cache_line_size: usize) -> Self {
19 Self {
20 cache_line_size,
21 use_interleaved: true,
22 }
23 }
24
25 pub fn calculate_alignment<T>(&self) -> usize {
27 std::cmp::max(std::mem::align_of::<T>(), self.cache_line_size)
28 }
29
30 pub fn calculate_padding(&self, size: usize, alignment: usize) -> usize {
32 (alignment - (size % alignment)) % alignment
33 }
34
35 pub fn is_cache_friendly<T>(&self, data: &[T]) -> bool {
37 let size = std::mem::size_of_val(data);
38 size <= self.cache_line_size
39 }
40}
41
42#[derive(Debug, Clone)]
44pub struct InterleavedStorage<T: Clone> {
45 data: Vec<T>,
47 elements_per_line: usize,
49}
50
51impl<T: Clone> InterleavedStorage<T> {
52 pub fn new(capacity: usize, cache_line_size: usize) -> Self {
54 let element_size = std::mem::size_of::<T>();
55 let elements_per_line = cache_line_size / element_size;
56
57 Self {
58 data: Vec::with_capacity(capacity),
59 elements_per_line,
60 }
61 }
62
63 pub fn get(&self, index: usize) -> Option<&T> {
65 self.data.get(index)
66 }
67
68 pub fn set(&mut self, index: usize, value: T) -> MapletResult<()> {
70 if index >= self.data.len() {
71 self.data.resize(index + 1, unsafe { std::mem::zeroed() });
72 }
73 self.data[index] = value;
74 Ok(())
75 }
76}
77
78#[cfg(test)]
79mod tests {
80 use super::*;
81
82 #[test]
83 fn test_layout_optimizer() {
84 let optimizer = LayoutOptimizer::new(64);
85
86 let alignment = optimizer.calculate_alignment::<u64>();
87 assert!(alignment >= 8);
88
89 let padding = optimizer.calculate_padding(10, 8);
90 assert_eq!(padding, 6);
91 }
92
93 #[test]
94 fn test_interleaved_storage() {
95 let mut storage = InterleavedStorage::<u64>::new(100, 64);
96
97 assert!(storage.set(0, 42).is_ok());
98 assert_eq!(storage.get(0), Some(&42));
99 }
100}