mappy_core/
layout.rs

1//! Cache-friendly memory layout optimization
2//! 
3//! Implements memory layout optimizations for better cache locality.
4
5use crate::MapletResult;
6
7/// Memory layout optimizer
8#[derive(Debug, Clone)]
9pub struct LayoutOptimizer {
10    /// Cache line size in bytes
11    cache_line_size: usize,
12    /// Whether to use interleaved layout
13    use_interleaved: bool,
14}
15
16impl LayoutOptimizer {
17    /// Create a new layout optimizer
18    pub fn new(cache_line_size: usize) -> Self {
19        Self {
20            cache_line_size,
21            use_interleaved: true,
22        }
23    }
24    
25    /// Calculate optimal alignment for a type
26    pub fn calculate_alignment<T>(&self) -> usize {
27        std::cmp::max(std::mem::align_of::<T>(), self.cache_line_size)
28    }
29    
30    /// Calculate padding needed for alignment
31    pub fn calculate_padding(&self, size: usize, alignment: usize) -> usize {
32        (alignment - (size % alignment)) % alignment
33    }
34    
35    /// Check if layout is cache-friendly
36    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/// Interleaved storage for better cache locality
43#[derive(Debug, Clone)]
44pub struct InterleavedStorage<T: Clone> {
45    /// Interleaved data
46    data: Vec<T>,
47    /// Number of elements per cache line
48    elements_per_line: usize,
49}
50
51impl<T: Clone> InterleavedStorage<T> {
52    /// Create new interleaved storage
53    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    /// Get element at index
64    pub fn get(&self, index: usize) -> Option<&T> {
65        self.data.get(index)
66    }
67    
68    /// Set element at index
69    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}