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    pub fn new(initial_capacity: usize) -> Self {
21        Self {
22            capacity: initial_capacity,
23            growth_factor: 2.0,
24            max_capacity: usize::MAX,
25        }
26    }
27    
28    /// Calculate new capacity for resizing
29    pub fn calculate_new_capacity(&self, _current_load: usize) -> usize {
30        let new_capacity = (self.capacity as f64 * self.growth_factor) as usize;
31        new_capacity.min(self.max_capacity)
32    }
33    
34    /// Check if resizing is needed
35    pub fn should_resize(&self, current_load: usize, max_load_factor: f64) -> bool {
36        let load_factor = current_load as f64 / self.capacity as f64;
37        load_factor > max_load_factor
38    }
39    
40    /// Update capacity after resize
41    pub fn update_capacity(&mut self, new_capacity: usize) {
42        self.capacity = new_capacity;
43    }
44}
45
46/// Merge manager for combining maplets
47#[derive(Debug, Clone)]
48pub struct MergeManager {
49    /// Maximum merge operations allowed
50    max_merges: usize,
51    /// Current merge count
52    merge_count: usize,
53}
54
55impl MergeManager {
56    /// Create a new merge manager
57    pub fn new(max_merges: usize) -> Self {
58        Self {
59            max_merges,
60            merge_count: 0,
61        }
62    }
63    
64    /// Check if merge is allowed
65    pub fn can_merge(&self) -> bool {
66        self.merge_count < self.max_merges
67    }
68    
69    /// Record a merge operation
70    pub fn record_merge(&mut self) -> MapletResult<()> {
71        if !self.can_merge() {
72            return Err(MapletError::MergeFailed("Maximum merges exceeded".to_string()));
73        }
74        self.merge_count += 1;
75        Ok(())
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    #[test]
84    fn test_resize_manager() {
85        let mut manager = ResizeManager::new(100);
86        
87        assert_eq!(manager.capacity, 100);
88        assert!(!manager.should_resize(50, 0.8));
89        assert!(manager.should_resize(90, 0.8));
90        
91        let new_capacity = manager.calculate_new_capacity(90);
92        assert_eq!(new_capacity, 200);
93        
94        manager.update_capacity(200);
95        assert_eq!(manager.capacity, 200);
96    }
97
98    #[test]
99    fn test_merge_manager() {
100        let mut manager = MergeManager::new(5);
101        
102        assert!(manager.can_merge());
103        
104        for _ in 0..5 {
105            assert!(manager.record_merge().is_ok());
106        }
107        
108        assert!(!manager.can_merge());
109        assert!(manager.record_merge().is_err());
110    }
111}