#[cfg(feature = "cache-efficiency-debug")] mod impl_ { /// A helper to collect useful information about cache efficiency. pub struct Debug { owner: String, hits: usize, puts: usize, misses: usize, } impl Debug { /// Create a new instance #[inline] pub fn new(owner: String) -> Self { Debug { owner, hits: 0, puts: 0, misses: 0, } } /// Count cache insertions #[inline] pub fn put(&mut self) { self.puts += 1; } /// Count hits #[inline] pub fn hit(&mut self) { self.hits += 1; } /// Count misses #[inline] pub fn miss(&mut self) { self.misses += 1; } } impl Drop for Debug { fn drop(&mut self) { let hits = self.hits; let misses = self.misses; let ratio = hits as f32 / misses as f32; eprintln!( "{}[{:0x}]: {} / {} (hits/misses) = {:.02}%, puts = {}", self.owner, self as *const _ as usize, hits, misses, ratio * 100.0, self.puts ); } } } #[cfg(not(feature = "cache-efficiency-debug"))] mod impl_ { /// The disabled, zero size do-nothing equivalent pub struct Debug; impl Debug { /// Create a new instance #[inline] pub fn new(_owner: String) -> Self { Debug } /// noop pub fn put(&mut self) {} /// noop pub fn hit(&mut self) {} /// noop pub fn miss(&mut self) {} } } pub use impl_::Debug;