1use std::ops::{Deref, DerefMut};
2use std::sync::{Arc, Weak};
3
4#[derive(Debug)]
5pub struct SharedPtr<T: ?Sized> {
6 rc: Option<Arc<T>>,
7}
8
9impl<T> SharedPtr<T> {
10 #[inline]
11 pub fn new(v: T) -> SharedPtr<T> {
12 SharedPtr {
13 rc: Some(Arc::new(v)),
14 }
15 }
16 #[inline]
17 pub fn write(&mut self, v: T) {
18 self.rc = Some(Arc::new(v));
19 }
20 #[inline]
21 pub fn assume_init(self) -> Option<Arc<T>> {
22 self.rc
23 }
24
25}
26impl<T: ?Sized> SharedPtr<T> {
27 #[inline]
28 pub fn zeroed() -> SharedPtr<T> {
29 SharedPtr { rc: None }
30 }
31 #[inline]
32 pub fn is_null(&self) -> bool {
33 self.rc.is_none()
34 }
35 #[inline]
36 pub fn set_null(&mut self) {
37 self.rc = None;
38 }
39 #[inline]
40 pub fn weak(&self) -> Option<Weak<T>> {
41 self.rc.as_ref().map(Arc::downgrade)
42 }
43 #[inline]
45 pub fn get_mut(&mut self) -> Option<&mut T> {
46 if let Some(ref mut rc)=self.rc {
47 Arc::get_mut(rc)
48 }else{
49 None
50 }
51 }
52
53}
54
55impl <T:Clone> SharedPtr<T> {
56 #[inline]
57 pub fn clone_inner(mut self)->Option<T>{
58 if let Some(ref mut rc)=self.rc {
59 Some(rc.as_ref().clone())
60 }else{
61 None
62 }
63 }
64}
65
66impl<T: ?Sized> Deref for SharedPtr<T> {
67 type Target = Arc<T>;
68 #[inline]
69 fn deref(&self) -> &Self::Target {
70 self.rc.as_ref().expect("null shared deref")
71 }
72}
73
74impl<T: ?Sized> DerefMut for SharedPtr<T> {
75 #[inline]
76 fn deref_mut(&mut self) -> &mut Self::Target {
77 self.rc.as_mut().expect("null shared deref mut")
78 }
79}
80
81impl<T: ?Sized> Clone for SharedPtr<T> {
82 #[inline]
83 fn clone(&self) -> Self {
84 Self {
85 rc: self.rc.clone(),
86 }
87 }
88}
89
90impl<T: ?Sized> From<Arc<T>> for SharedPtr<T> {
91 #[inline]
92 fn from(r: Arc<T>) -> Self {
93 Self { rc: Some(r) }
94 }
95}
96
97impl<T: ?Sized> Default for SharedPtr<T> {
98 #[inline]
99 fn default() -> Self {
100 SharedPtr::<T>::zeroed()
101 }
102}
103
104#[test]
105fn assert_send_sync() {
106 fn asserts<T: Send + Sync>() {}
107
108 asserts::<SharedPtr<u32>>();
109 asserts::<SharedPtr<str>>();
110}