cache_rs/config/gdsf.rs
1//! Configuration for the Greedy Dual-Size Frequency (GDSF) cache.
2
3use core::fmt;
4use core::num::NonZeroUsize;
5
6/// Configuration for a GDSF (Greedy Dual-Size Frequency) cache.
7///
8/// GDSF assigns a priority to each item based on the formula:
9/// Priority = (Frequency / Size) + Global_Age
10///
11/// # Examples
12///
13/// ```
14/// use cache_rs::config::gdsf::GdsfCacheConfig;
15/// use core::num::NonZeroUsize;
16///
17/// // Create a config with capacity of 100 items and initial age of 0.0
18/// let config = GdsfCacheConfig::new(NonZeroUsize::new(100).unwrap());
19///
20/// assert_eq!(config.capacity(), NonZeroUsize::new(100).unwrap());
21/// assert_eq!(config.initial_age(), 0.0);
22/// ```
23#[derive(Clone, Copy)]
24pub struct GdsfCacheConfig {
25 /// Maximum number of key-value pairs the cache can hold
26 capacity: NonZeroUsize,
27
28 /// Initial global age value
29 initial_age: f64,
30}
31
32impl GdsfCacheConfig {
33 /// Creates a new configuration for a GDSF cache with initial age of 0.0.
34 ///
35 /// # Arguments
36 /// * `capacity` - Maximum number of key-value pairs the cache can hold
37 pub fn new(capacity: NonZeroUsize) -> Self {
38 Self {
39 capacity,
40 initial_age: 0.0,
41 }
42 }
43
44 /// Creates a new configuration for a GDSF cache with a specific initial age.
45 ///
46 /// # Arguments
47 /// * `capacity` - Maximum number of key-value pairs the cache can hold
48 /// * `initial_age` - Initial global age value
49 pub fn with_initial_age(capacity: NonZeroUsize, initial_age: f64) -> Self {
50 Self {
51 capacity,
52 initial_age,
53 }
54 }
55
56 /// Returns the maximum number of key-value pairs the cache can hold.
57 pub fn capacity(&self) -> NonZeroUsize {
58 self.capacity
59 }
60
61 /// Returns the initial global age value.
62 pub fn initial_age(&self) -> f64 {
63 self.initial_age
64 }
65}
66
67impl fmt::Debug for GdsfCacheConfig {
68 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
69 f.debug_struct("GdsfCacheConfig")
70 .field("capacity", &self.capacity)
71 .field("initial_age", &self.initial_age)
72 .finish()
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn test_gdsf_config_creation() {
82 let config = GdsfCacheConfig::new(NonZeroUsize::new(100).unwrap());
83 assert_eq!(config.capacity().get(), 100);
84 assert_eq!(config.initial_age(), 0.0);
85
86 let config_with_age =
87 GdsfCacheConfig::with_initial_age(NonZeroUsize::new(50).unwrap(), 10.5);
88 assert_eq!(config_with_age.capacity().get(), 50);
89 assert_eq!(config_with_age.initial_age(), 10.5);
90 }
91}