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}