Skip to main content

cgp_field/types/
mref.rs

1use core::ops::Deref;
2
3pub enum MRef<'a, T> {
4    Ref(&'a T),
5    Owned(T),
6}
7
8impl<T> Deref for MRef<'_, T> {
9    type Target = T;
10
11    fn deref(&self) -> &T {
12        match self {
13            Self::Ref(value) => value,
14            Self::Owned(value) => value,
15        }
16    }
17}
18
19impl<T> AsRef<T> for MRef<'_, T> {
20    fn as_ref(&self) -> &T {
21        self.deref()
22    }
23}
24
25impl<T> From<T> for MRef<'_, T> {
26    fn from(value: T) -> Self {
27        Self::Owned(value)
28    }
29}
30
31impl<'a, T> From<&'a T> for MRef<'a, T> {
32    fn from(value: &'a T) -> Self {
33        Self::Ref(value)
34    }
35}
36
37impl<T> MRef<'_, T>
38where
39    T: Clone,
40{
41    pub fn get_or_clone(self) -> T {
42        match self {
43            Self::Ref(value) => value.clone(),
44            Self::Owned(value) => value,
45        }
46    }
47}