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