cluStaticData/once_const_static/
mod.rs1
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
44impl<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