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 #[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 #[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 #[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 pub const fn update_capacity(&mut self, new_capacity: usize) {
51 self.capacity = new_capacity;
52 }
53}
54
55#[derive(Debug, Clone)]
57pub struct MergeManager {
58 max_merges: usize,
60 merge_count: usize,
62}
63
64impl MergeManager {
65 #[must_use]
67 pub const fn new(max_merges: usize) -> Self {
68 Self {
69 max_merges,
70 merge_count: 0,
71 }
72 }
73
74 #[must_use]
76 pub const fn can_merge(&self) -> bool {
77 self.merge_count < self.max_merges
78 }
79
80 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}