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
11pub 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}