1 use std::hash::Hash; 2 use std::hash::Hasher; 3 use std::sync::atomic::AtomicUsize; 4 use std::sync::atomic::Ordering; 5 6 /// Cached size field used in generated code. 7 /// 8 /// It is always equal to itself to simplify generated code. 9 /// (Generated code can use `#[derive(Eq)]`). 10 /// 11 /// This type should rarely be used directly. 12 #[derive(Debug, Default)] 13 pub struct CachedSize { 14 size: AtomicUsize, 15 } 16 17 impl CachedSize { 18 /// Create a new `CachedSize` object. new() -> CachedSize19 pub const fn new() -> CachedSize { 20 CachedSize { 21 size: AtomicUsize::new(0), 22 } 23 } 24 25 /// Get cached size get(&self) -> u3226 pub fn get(&self) -> u32 { 27 self.size.load(Ordering::Relaxed) as u32 28 } 29 30 /// Set cached size set(&self, size: u32)31 pub fn set(&self, size: u32) { 32 self.size.store(size as usize, Ordering::Relaxed) 33 } 34 } 35 36 impl Clone for CachedSize { clone(&self) -> CachedSize37 fn clone(&self) -> CachedSize { 38 CachedSize { 39 size: AtomicUsize::new(self.size.load(Ordering::Relaxed)), 40 } 41 } 42 } 43 44 impl PartialEq<CachedSize> for CachedSize { eq(&self, _other: &CachedSize) -> bool45 fn eq(&self, _other: &CachedSize) -> bool { 46 true 47 } 48 } 49 50 impl Eq for CachedSize {} 51 52 impl Hash for CachedSize { hash<H: Hasher>(&self, _state: &mut H)53 fn hash<H: Hasher>(&self, _state: &mut H) { 54 // ignore cached size in cache computation 55 } 56 } 57