cluStaticData/once_const_static/
mod.rs

1
2pub mod core {
3	mod always_lock;
4	pub use self::always_lock::*;
5	
6	mod atomic_lock;
7	pub use self::atomic_lock::*;
8}
9
10pub mod generic;
11
12#[macro_use]
13mod macros;
14pub use self::macros::*;
15
16use ::core::fmt::Debug;
17use ::core::fmt::Display;
18use ::core::ops::Deref;
19use ::core::sync::atomic::AtomicU8;
20use ::core::cell::UnsafeCell;
21use ::core::fmt;
22
23use crate::once_const_static::generic::GenericStaticData;
24use crate::once_const_static::generic::UnsafeGenericStaticData;
25use crate::once_const_static::core::AlwaysLockOnce;
26
27use crate::err::StaticErr;
28use crate::err::IgnoreInitErr;
29
30
31
32
33pub type StaticData<T>			= UnkStaticData<T, AtomicU8>;
34pub type StaticDataAlwaysLock<T>	= UnkStaticData<T, AlwaysLockOnce>;
35
36pub struct UnkStaticData<T, I> {
37	data: UnsafeCell<T>,
38	sync_data: I,
39}
40
41unsafe impl<T, I> Sync for UnkStaticData<T, I> where T: Sync {}
42unsafe impl<T, I> Send for UnkStaticData<T, I> where T: Sync + Send {}
43
44//DONT TRAIT!
45impl<T, I> UnkStaticData<T, I> where Self: UnsafeGenericStaticData<T> {
46	#[inline(always)]
47	pub unsafe fn set_box(&self, v: Box<T>) -> Result<(), StaticErr<Box<T>>> {
48		UnsafeGenericStaticData::set_box(self, v)
49	}
50	
51	#[inline(always)]
52	pub unsafe fn set_raw(&self, v: T) -> Result<(), StaticErr<T>> {
53		UnsafeGenericStaticData::set_raw(self, v)
54	}
55}
56
57impl<T, I> UnkStaticData<T, I> where Self: GenericStaticData<T> {
58	#[inline(always)]
59	pub fn set(&self, v: T) -> Result<(), StaticErr<T>> {
60		GenericStaticData::set(self, v)
61	}
62	
63	#[inline(always)]
64	pub fn replace(&self, v: T) -> Result<T, StaticErr<T>> {
65		GenericStaticData::replace(self, v)
66	}
67	
68	#[inline(always)]
69	pub unsafe fn unsafe_replace(&self, v: T) -> T {
70		GenericStaticData::unsafe_replace(self, v)
71	}
72	
73	#[inline(always)]
74	pub fn get<'a>(&'a self) -> &'a T {
75		GenericStaticData::get(self)
76	}
77	
78	#[inline(always)]
79	pub fn ignore_initialize(&self) -> Result<(), IgnoreInitErr> {
80		GenericStaticData::ignore_initialize(self)	
81	}
82	
83	#[inline(always)]
84	pub fn ignore_initialize_dont_result(&self) {
85		GenericStaticData::ignore_initialize_dont_result(self)
86	}
87	
88	#[inline(always)]
89	pub fn is_init_state(&self) -> bool {
90		GenericStaticData::is_init_state(self)
91	}
92	
93	#[inline(always)]
94	pub fn is_noinit_state(&self) -> bool {
95		GenericStaticData::is_noinit_state(self)
96	}
97}
98
99
100impl<T, I> AsRef<T> for UnkStaticData<T, I> where Self: GenericStaticData<T> {
101	#[inline(always)]
102	fn as_ref(&self) -> &T {
103		self.get()
104	}
105}
106
107impl<T, I> Deref for UnkStaticData<T, I> where Self: GenericStaticData<T> {
108	type Target = T;
109	
110	#[inline(always)]
111	fn deref(&self) -> &Self::Target {
112		self.get()
113	}
114}
115
116impl<T, I> Debug for UnkStaticData<T, I> where T: Debug, Self: GenericStaticData<T> {
117	#[inline(always)]
118	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
119		self.get().fmt(f)
120	}
121}
122
123impl<T, I> Display for UnkStaticData<T, I> where T: Display, Self: GenericStaticData<T> {
124	#[inline(always)]
125	fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
126		self.get().fmt(f)
127	}
128}
129
130
131