sharedptr/
Arc.rs

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    /// if ptr is no unique,none will be returned, or Some(&mut T) be returned.
44    #[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}