mappy_core/
resize.rs

1//! Dynamic resizing and merging
2//! 
3//! Implements dynamic resizing and merging capabilities for maplets.
4
5use crate::{MapletError, MapletResult};
6
7/// Resize manager for maplets
8#[derive(Debug, Clone)]
9pub struct ResizeManager {
10    /// Current capacity
11    capacity: usize,
12    /// Growth factor for resizing
13    growth_factor: f64,
14    /// Maximum capacity
15    max_capacity: usize,
16}
17
18impl ResizeManager {
19    /// Create a new resize manager
20    #[must_use]
21    pub const fn new(initial_capacity: usize) -> Self {
22        Self {
23            capacity: initial_capacity,
24            growth_factor: 2.0,
25            max_capacity: usize::MAX,
26        }
27    }
28    
29    /// Calculate new capacity for resizing
30    #[must_use]
31    pub fn calculate_new_capacity(&self, _current_load: usize) -> usize {
32        #[allow(clippy::cast_possible_truncation, clippy::cast_sign_loss, clippy::cast_precision_loss)]
33        {
34            let new_capacity = (self.capacity as f64 * self.growth_factor) as usize;
35            new_capacity.min(self.max_capacity)
36        }
37    }
38    
39    /// Check if resizing is needed
40    #[must_use]
41    pub fn should_resize(&self, current_load: usize, max_load_factor: f64) -> bool {
42        #[allow(clippy::cast_precision_loss)]
43        {
44            let load_factor = current_load as f64 / self.capacity as f64;
45            load_factor > max_load_factor
46        }
47    }
48    
49    /// Update capacity after resize
50    pub const fn update_capacity(&mut self, new_capacity: usize) {
51        self.capacity = new_capacity;
52    }
53}
54
55/// Merge manager for combining maplets
56#[derive(Debug, Clone)]
57pub struct MergeManager {
58    /// Maximum merge operations allowed
59    max_merges: usize,
60    /// Current merge count
61    merge_count: usize,
62}
63
64impl MergeManager {
65    /// Create a new merge manager
66    #[must_use]
67    pub const fn new(max_merges: usize) -> Self {
68        Self {
69            max_merges,
70            merge_count: 0,
71        }
72    }
73    
74    /// Check if merge is allowed
75    #[must_use]
76    pub const fn can_merge(&self) -> bool {
77        self.merge_count < self.max_merges
78    }
79    
80    /// Record a merge operation
81    /// 
82    /// # Errors
83    /// 
84    /// Returns an error if the merge limit is exceeded
85    pub fn record_merge(&mut self) -> MapletResult<()> {
86        if !self.can_merge() {
87            return Err(MapletError::MergeFailed("Maximum merges exceeded".to_string()));
88        }
89        self.merge_count += 1;
90        Ok(())
91    }
92}
93
94#[cfg(test)]
95mod tests {
96    use super::*;
97
98    #[test]
99    fn test_resize_manager() {
100        let mut manager = ResizeManager::new(100);
101        
102        assert_eq!(manager.capacity, 100);
103        assert!(!manager.should_resize(50, 0.8));
104        assert!(manager.should_resize(90, 0.8));
105        
106        let new_capacity = manager.calculate_new_capacity(90);
107        assert_eq!(new_capacity, 200);
108        
109        manager.update_capacity(200);
110        assert_eq!(manager.capacity, 200);
111    }
112
113    #[test]
114    fn test_merge_manager() {
115        let mut manager = MergeManager::new(5);
116        
117        assert!(manager.can_merge());
118        
119        for _ in 0..5 {
120            assert!(manager.record_merge().is_ok());
121        }
122        
123        assert!(!manager.can_merge());
124        assert!(manager.record_merge().is_err());
125    }
126}