1use core::fmt::Display;
2use std::{
3 num::NonZeroUsize,
4 sync::atomic::{AtomicUsize, Ordering},
5};
6
7#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
13pub struct StoreId(NonZeroUsize);
14
15#[cfg(feature = "artifact-size")]
16impl loupe::MemoryUsage for StoreId {
17 fn size_of_val(&self, _visited: &mut dyn loupe::MemoryUsageTracker) -> usize {
18 std::mem::size_of_val(self)
19 }
20}
21
22impl Default for StoreId {
23 fn default() -> Self {
25 static NEXT_ID: AtomicUsize = AtomicUsize::new(1);
28 Self(NonZeroUsize::new(NEXT_ID.fetch_add(1, Ordering::Relaxed)).unwrap())
29 }
30}
31
32impl Display for StoreId {
33 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
34 let val: usize = self.0.into();
35 if val == usize::MAX {
36 write!(f, "unknown")
37 } else {
38 write!(f, "{}", self.0)
39 }
40 }
41}