kaspa_utils/
refs.rs

1use std::{ops::Deref, rc::Rc, sync::Arc};
2
3/// Enum used to represent a concrete varying pointer type which only needs to be accessed by ref.
4/// We avoid adding a `Val(T)` variant in order to keep the size of the enum minimal
5pub 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}