abstract_ref/
lib.rs

1use std::borrow::Borrow;
2
3pub mod types;
4
5pub trait Type<T: ?Sized> {
6    type RefT;
7}
8pub trait MakeMutType<T: ?Sized>: Type<T> {
9    fn make_mut(p: &mut Self::RefT) -> &mut T;
10}
11
12pub struct Ref<Tp: Type<T>, T: ?Sized>(Tp::RefT);
13
14impl<Tp: Type<T>, T: ?Sized> AsRef<T> for Ref<Tp, T>
15where
16    Tp::RefT: Borrow<T>,
17{
18    fn as_ref(&self) -> &T {
19        self.0.borrow()
20    }
21}
22impl<Tp: Type<T>, T: ?Sized> std::borrow::Borrow<T> for Ref<Tp, T>
23where
24    Tp::RefT: Borrow<T>,
25{
26    fn borrow(&self) -> &T {
27        self.0.borrow()
28    }
29}
30impl<Tp: Type<T>, T: ?Sized> std::ops::Deref for Ref<Tp, T>
31where
32    Tp::RefT: Borrow<T>,
33{
34    type Target = T;
35
36    fn deref(&self) -> &T {
37        self.0.borrow()
38    }
39}
40impl<Tp: MakeMutType<T>, T: ?Sized> Ref<Tp, T> {
41    pub fn make_mut(&mut self) -> &mut T {
42        Tp::make_mut(&mut self.0)
43    }
44}
45impl<Tp: Type<T>, T: ?Sized> Clone for Ref<Tp, T>
46where
47    Tp::RefT: Clone,
48{
49    fn clone(&self) -> Self {
50        Ref(self.0.clone())
51    }
52}
53impl<Tp: Type<T>, T> From<T> for Ref<Tp, T>
54where
55    Tp::RefT: From<T>
56{
57    fn from(v: T) -> Self {
58        Ref(Tp::RefT::from(v))
59    }
60}
61
62#[cfg(test)]
63mod tests;