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}