use core::sync::atomic::{AtomicU32, Ordering};
#[derive(Debug)]
pub struct CachedSize {
size: AtomicU32,
}
impl CachedSize {
#[inline]
pub const fn new() -> Self {
Self {
size: AtomicU32::new(0),
}
}
#[inline]
pub fn get(&self) -> u32 {
self.size.load(Ordering::Relaxed)
}
#[inline]
pub fn set(&self, size: u32) {
self.size.store(size, Ordering::Relaxed);
}
}
impl Default for CachedSize {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl Clone for CachedSize {
#[inline]
fn clone(&self) -> Self {
Self::new()
}
}
impl PartialEq for CachedSize {
#[inline]
fn eq(&self, _other: &Self) -> bool {
true
}
}
impl Eq for CachedSize {}
impl core::hash::Hash for CachedSize {
#[inline]
fn hash<H: core::hash::Hasher>(&self, _state: &mut H) {
}
}
#[cfg(feature = "arbitrary")]
impl<'a> arbitrary::Arbitrary<'a> for CachedSize {
fn arbitrary(_u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
Ok(CachedSize::new())
}
}
#[cfg(test)]
mod tests {
use super::*;
const _: fn() = || {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<CachedSize>();
};
#[test]
fn test_new_returns_zero() {
assert_eq!(CachedSize::new().get(), 0);
}
#[test]
fn test_default_returns_zero() {
assert_eq!(CachedSize::default().get(), 0);
}
#[test]
fn test_set_and_get_roundtrip() {
let cs = CachedSize::new();
cs.set(42);
assert_eq!(cs.get(), 42);
cs.set(0);
assert_eq!(cs.get(), 0);
cs.set(u32::MAX);
assert_eq!(cs.get(), u32::MAX);
}
#[test]
fn test_clone_resets_to_zero() {
let cs = CachedSize::new();
cs.set(100);
let cloned = cs.clone();
assert_eq!(cloned.get(), 0);
assert_eq!(cs.get(), 100);
}
#[test]
fn test_partial_eq_ignores_value() {
let a = CachedSize::new();
let b = CachedSize::new();
a.set(1);
b.set(99);
assert_eq!(a, b);
}
#[test]
fn test_hash_ignores_value() {
use core::hash::{Hash, Hasher};
use std::collections::hash_map::DefaultHasher;
fn hash(x: &CachedSize) -> u64 {
let mut h = DefaultHasher::new();
x.hash(&mut h);
h.finish()
}
let a = CachedSize::new();
let b = CachedSize::new();
a.set(1);
b.set(99);
assert_eq!(hash(&a), hash(&b));
}
#[allow(dead_code)]
#[derive(Hash)]
struct MessageLike {
value: i32,
__cached: CachedSize,
__unknown: crate::UnknownFields,
}
}