• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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