smart/
shared.rs

1use std::ops::Deref;
2use std::rc::Rc;
3use std::sync::Arc;
4
5use crate::SyncPointer;
6use crate::pointer::Pointer;
7
8/// A dynamic smart pointer which is not guaranteed to be threadsafe.
9///
10/// This type can be constructed from any shared ownership pointer, including Rc. It also provides
11/// a conversion method to SyncPointer, which must be threadsafe. Converting a SharedPointer with
12/// a non-threadsafe implementation would panic.
13pub struct SharedPointer<T: ?Sized> {
14    pub(crate) inner: Pointer<T>,
15}
16
17impl<T> SharedPointer<T> {
18    /// Construct a new SharedPointer directly.
19    ///
20    /// By default, this uses an Arc, so a SharedPointer constructed this way can be cast into a
21    /// SyncPointer without panicking.
22    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}