#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
#[must_use = "arena stats provide memory usage information"]
pub struct ArenaStats {
pub bytes_allocated: usize,
pub bytes_reserved: usize,
pub block_count: usize,
}
impl ArenaStats {
#[must_use]
#[allow(clippy::cast_precision_loss)]
pub fn utilization(&self) -> f64 {
if self.bytes_reserved == 0 {
0.0
} else {
self.bytes_allocated as f64 / self.bytes_reserved as f64
}
}
#[must_use]
pub fn bytes_idle(&self) -> usize {
self.bytes_reserved.saturating_sub(self.bytes_allocated)
}
}
impl std::fmt::Display for ArenaStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"{} allocated / {} reserved ({} blocks, {:.1}% util)",
self.bytes_allocated,
self.bytes_reserved,
self.block_count,
self.utilization() * 100.0
)
}
}