shipyard/
unique.rs

1#[cfg(feature = "thread_local")]
2mod thread_local;
3
4use crate::component::Unique;
5use crate::memory_usage::StorageMemoryUsage;
6use crate::storage::{SBoxBuilder, Storage};
7use crate::tracking::TrackingTimestamp;
8use core::any::type_name;
9use core::mem::size_of;
10
11/// Unique storage.
12pub struct UniqueStorage<T: Unique> {
13    pub(crate) value: T,
14    pub(crate) insert: TrackingTimestamp,
15    pub(crate) modification: TrackingTimestamp,
16    pub(crate) last_insert: TrackingTimestamp,
17    pub(crate) last_modification: TrackingTimestamp,
18    pub(crate) clone: Option<fn(&T) -> T>,
19}
20
21impl<T: Unique + Send + Sync> Storage for UniqueStorage<T> {
22    fn memory_usage(&self) -> Option<StorageMemoryUsage> {
23        Some(StorageMemoryUsage {
24            storage_name: type_name::<Self>().into(),
25            allocated_memory_bytes: size_of::<Self>(),
26            used_memory_bytes: size_of::<Self>(),
27            component_count: 1,
28        })
29    }
30
31    fn is_empty(&self) -> bool {
32        false
33    }
34
35    fn clear_all_inserted(&mut self, current: TrackingTimestamp) {
36        self.insert = current;
37    }
38
39    fn clear_all_modified(&mut self, current: TrackingTimestamp) {
40        self.modification = current;
41    }
42
43    fn try_clone(&self, other_current: TrackingTimestamp) -> Option<SBoxBuilder> {
44        self.clone.map(|clone| {
45            SBoxBuilder::new(UniqueStorage {
46                value: clone(&self.value),
47                insert: other_current,
48                modification: TrackingTimestamp::origin(),
49                last_insert: TrackingTimestamp::origin(),
50                last_modification: TrackingTimestamp::origin(),
51                clone: None,
52            })
53        })
54    }
55}
56
57impl<T: Unique> UniqueStorage<T> {
58    pub(crate) fn new(value: T, current: TrackingTimestamp) -> Self {
59        UniqueStorage {
60            value,
61            insert: current,
62            modification: TrackingTimestamp::origin(),
63            last_insert: TrackingTimestamp::origin(),
64            last_modification: TrackingTimestamp::origin(),
65            clone: None,
66        }
67    }
68}
69
70impl<T: Unique + Clone> UniqueStorage<T> {
71    pub(crate) fn register_clone(&mut self) {
72        self.clone = Some(T::clone)
73    }
74}