1use std::ops::Deref;
2use std::sync::{Arc, Mutex, MutexGuard};
3
4pub struct Shared<T>
7where
8 T: Default,
9{
10 guard: Arc<Mutex<T>>,
11}
12
13impl<T> Shared<T>
14where
15 T: Default,
16{
17 #[inline(always)]
18 pub fn new(element: T) -> Self {
19 Self {
20 guard: Arc::new(Mutex::new(element)),
21 }
22 }
23
24 #[inline(always)]
25 pub fn default() -> Self {
26 Self::new(T::default())
27 }
28
29 #[inline(always)]
30 pub fn lock(&self) -> MutexGuard<'_, T> {
31 self.guard.lock().unwrap()
32 }
33
34 #[inline(always)]
35 pub fn arc(&self) -> Arc<Mutex<T>> {
36 Arc::clone(&self.guard)
37 }
38}
39
40impl<T> Deref for Shared<T>
41where
42 T: Default,
43{
44 type Target = Arc<Mutex<T>>;
45
46 fn deref(&self) -> &Self::Target {
47 &self.guard
48 }
49}