use std::hash::Hash; use std::hash::Hasher; use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering; /// Cached size field used in generated code. /// /// It is always equal to itself to simplify generated code. /// (Generated code can use `#[derive(Eq)]`). /// /// This type should rarely be used directly. #[derive(Debug, Default)] pub struct CachedSize { size: AtomicUsize, } impl CachedSize { /// Create a new `CachedSize` object. pub const fn new() -> CachedSize { CachedSize { size: AtomicUsize::new(0), } } /// Get cached size pub fn get(&self) -> u32 { self.size.load(Ordering::Relaxed) as u32 } /// Set cached size pub fn set(&self, size: u32) { self.size.store(size as usize, Ordering::Relaxed) } } impl Clone for CachedSize { fn clone(&self) -> CachedSize { CachedSize { size: AtomicUsize::new(self.size.load(Ordering::Relaxed)), } } } impl PartialEq for CachedSize { fn eq(&self, _other: &CachedSize) -> bool { true } } impl Eq for CachedSize {} impl Hash for CachedSize { fn hash(&self, _state: &mut H) { // ignore cached size in cache computation } }