1#![cfg_attr(test, deny(warnings))]
2#![deny(missing_docs)]
3
4use std::cell::UnsafeCell;
13use std::sync::Arc;
14use std::rc::Rc;
15use std::mem;
16
17pub struct RcMut<T> {
19 inner: Rc<UnsafeCell<T>>
20}
21
22impl<T> Clone for RcMut<T> {
23 fn clone(&self) -> RcMut<T> {
24 RcMut { inner: self.inner.clone() }
25 }
26}
27
28impl<T> RcMut<T> {
29 pub fn new(val: T) -> RcMut<T> {
31 RcMut {
32 inner: Rc::new(UnsafeCell::new(val))
33 }
34 }
35
36 pub unsafe fn as_rc(&self) -> &Rc<T> {
38 mem::transmute(&self.inner)
39 }
40
41 pub unsafe fn as_rc_mut(&mut self) -> &mut Rc<T> {
43 mem::transmute(&mut self.inner)
44 }
45
46 pub unsafe fn borrow(&self) -> &T {
48 mem::transmute(self.inner.get())
49 }
50
51 pub unsafe fn borrow_mut(&mut self) -> &mut T {
53 mem::transmute(self.inner.get())
54 }
55}
56
57pub struct ArcMut<T> {
59 inner: Arc<UnsafeCell<T>>
60}
61
62impl<T> Clone for ArcMut<T> {
63 fn clone(&self) -> ArcMut<T> {
64 ArcMut { inner: self.inner.clone() }
65 }
66}
67
68impl<T> ArcMut<T> {
69 pub fn new(val: T) -> ArcMut<T> {
71 ArcMut {
72 inner: Arc::new(UnsafeCell::new(val))
73 }
74 }
75
76 pub unsafe fn as_arc(&self) -> &Arc<T> {
78 mem::transmute(&self.inner)
79 }
80
81 pub unsafe fn as_arc_mut(&mut self) -> &mut Arc<T> {
83 mem::transmute(&mut self.inner)
84 }
85
86 pub unsafe fn borrow(&self) -> &T {
88 mem::transmute(self.inner.get())
89 }
90
91 pub unsafe fn borrow_mut(&mut self) -> &mut T {
93 mem::transmute(self.inner.get())
94 }
95}
96