1use std::{ops::Deref, rc::Rc, sync::Arc};
2
3pub enum Refs<'a, T> {
6 Ref(&'a T),
7 Arc(Arc<T>),
8 Rc(Rc<T>),
9 Box(Box<T>),
10}
11
12impl<T> AsRef<T> for Refs<'_, T> {
13 fn as_ref(&self) -> &T {
14 match self {
15 Refs::Ref(r) => r,
16 Refs::Arc(a) => a,
17 Refs::Rc(r) => r,
18 Refs::Box(b) => b,
19 }
20 }
21}
22
23impl<T> Deref for Refs<'_, T> {
24 type Target = T;
25
26 fn deref(&self) -> &Self::Target {
27 match self {
28 Refs::Ref(r) => r,
29 Refs::Arc(a) => a,
30 Refs::Rc(r) => r,
31 Refs::Box(b) => b,
32 }
33 }
34}
35
36impl<'a, T> From<&'a T> for Refs<'a, T> {
37 fn from(r: &'a T) -> Self {
38 Self::Ref(r)
39 }
40}
41
42impl<T> From<Arc<T>> for Refs<'_, T> {
43 fn from(a: Arc<T>) -> Self {
44 Self::Arc(a)
45 }
46}
47
48impl<T> From<Rc<T>> for Refs<'_, T> {
49 fn from(r: Rc<T>) -> Self {
50 Self::Rc(r)
51 }
52}
53
54impl<T> From<Box<T>> for Refs<'_, T> {
55 fn from(b: Box<T>) -> Self {
56 Self::Box(b)
57 }
58}