pub const HOT_THRESHOLD: u8 = 128;
pub const WARM_THRESHOLD: u8 = 16;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[repr(u8)]
pub enum TemperatureTier {
Hot = 0,
Warm = 1,
Cold = 2,
}
pub fn assign_tier(access_count: u8) -> TemperatureTier {
if access_count > HOT_THRESHOLD {
TemperatureTier::Hot
} else if access_count > WARM_THRESHOLD {
TemperatureTier::Warm
} else {
TemperatureTier::Cold
}
}
impl TemperatureTier {
#[inline]
pub const fn as_u8(self) -> u8 {
self as u8
}
}
impl TryFrom<u8> for TemperatureTier {
type Error = u8;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Self::Hot),
1 => Ok(Self::Warm),
2 => Ok(Self::Cold),
other => Err(other),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tier_assignment() {
assert_eq!(assign_tier(255), TemperatureTier::Hot);
assert_eq!(assign_tier(129), TemperatureTier::Hot);
assert_eq!(assign_tier(128), TemperatureTier::Warm); assert_eq!(assign_tier(64), TemperatureTier::Warm);
assert_eq!(assign_tier(17), TemperatureTier::Warm);
assert_eq!(assign_tier(16), TemperatureTier::Cold); assert_eq!(assign_tier(1), TemperatureTier::Cold);
assert_eq!(assign_tier(0), TemperatureTier::Cold);
}
#[test]
fn round_trip() {
for raw in 0..=2u8 {
let t = TemperatureTier::try_from(raw).unwrap();
assert_eq!(t.as_u8(), raw);
}
}
#[test]
fn invalid_tier() {
assert_eq!(TemperatureTier::try_from(3), Err(3));
}
#[test]
fn ordering() {
assert!(TemperatureTier::Hot < TemperatureTier::Warm);
assert!(TemperatureTier::Warm < TemperatureTier::Cold);
}
}