1use crate::{MapletError, MapletResult};
6
7#[derive(Debug, Clone)]
9pub struct ResizeManager {
10 capacity: usize,
12 growth_factor: f64,
14 max_capacity: usize,
16}
17
18impl ResizeManager {
19 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 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 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 pub fn update_capacity(&mut self, new_capacity: usize) {
42 self.capacity = new_capacity;
43 }
44}
45
46#[derive(Debug, Clone)]
48pub struct MergeManager {
49 max_merges: usize,
51 merge_count: usize,
53}
54
55impl MergeManager {
56 pub fn new(max_merges: usize) -> Self {
58 Self {
59 max_merges,
60 merge_count: 0,
61 }
62 }
63
64 pub fn can_merge(&self) -> bool {
66 self.merge_count < self.max_merges
67 }
68
69 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}