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    #[allow(dead_code)]
14    use_interleaved: bool,
15}
16
17impl LayoutOptimizer {
18    /// Create a new layout optimizer
19    #[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    /// Calculate optimal alignment for a type
28    #[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    /// Calculate padding needed for alignment
34    #[must_use]
35    pub const fn calculate_padding(&self, size: usize, alignment: usize) -> usize {
36        (alignment - (size % alignment)) % alignment
37    }
38
39    /// Check if layout is cache-friendly
40    #[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/// Interleaved storage for better cache locality
48#[derive(Debug, Clone)]
49pub struct InterleavedStorage<T: Clone> {
50    /// Interleaved data
51    data: Vec<T>,
52    /// Number of elements per cache line
53    #[allow(dead_code)]
54    elements_per_line: usize,
55}
56
57impl<T: Clone> InterleavedStorage<T> {
58    /// Create new interleaved storage
59    #[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    /// Get element at index
71    #[must_use]
72    pub fn get(&self, index: usize) -> Option<&T> {
73        self.data.get(index)
74    }
75
76    /// Set element at index
77    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}