1use std::ops::Deref;
2use std::rc::Rc;
3use std::sync::Arc;
4
5use crate::SyncPointer;
6use crate::pointer::Pointer;
7
8pub struct SharedPointer<T: ?Sized> {
14 pub(crate) inner: Pointer<T>,
15}
16
17impl<T> SharedPointer<T> {
18 pub fn new(data: T) -> SharedPointer<T> {
23 SharedPointer::from(Arc::new(data))
24 }
25}
26
27impl<T: ?Sized> Deref for SharedPointer<T> {
28 type Target = T;
29 fn deref(&self) -> &T {
30 &*self.inner
31 }
32}
33
34impl<T: ?Sized> From<&'static T> for SharedPointer<T> {
35 fn from(ptr: &'static T) -> SharedPointer<T> {
36 SharedPointer { inner: Pointer::from(ptr) }
37 }
38}
39
40impl<T: ?Sized> From<Rc<T>> for SharedPointer<T> {
41 fn from(ptr: Rc<T>) -> SharedPointer<T> {
42 SharedPointer { inner: Pointer::from(ptr) }
43 }
44}
45
46impl<T: ?Sized> From<Arc<T>> for SharedPointer<T> {
47 fn from(ptr: Arc<T>) -> SharedPointer<T> {
48 SharedPointer { inner: Pointer::from(ptr) }
49 }
50}
51
52impl<T: ?Sized> Clone for SharedPointer<T> {
53 fn clone(&self) -> SharedPointer<T> {
54 SharedPointer { inner: self.inner.clone() }
55 }
56}
57
58impl<T: ?Sized> From<SyncPointer<T>> for SharedPointer<T> {
59 fn from(ptr: SyncPointer<T>) -> SharedPointer<T> {
60 SharedPointer { inner: ptr.inner }
61 }
62}