evobench_tools/utillib/
ref_or_owned.rs1use std::{fmt::Display, ops::Deref};
5
6#[derive(Clone, Debug)]
7pub enum RefOrOwned<'t, T> {
8 Ref(&'t T),
9 Owned(T),
10}
11
12impl<'t, T> RefOrOwned<'t, T> {
13 pub fn as_ref(&self) -> &T {
14 match self {
15 RefOrOwned::Ref(borrowed) => borrowed,
16 RefOrOwned::Owned(owned) => owned,
17 }
18 }
19
20 pub fn into_owned(self) -> T
21 where
22 T: Clone,
23 {
24 match self {
25 RefOrOwned::Ref(borrowed) => borrowed.clone(),
26 RefOrOwned::Owned(owned) => owned,
27 }
28 }
29}
30
31impl<'t, T> From<&'t T> for RefOrOwned<'t, T> {
32 fn from(value: &'t T) -> Self {
33 Self::Ref(value)
34 }
35}
36
37impl<'t, T> From<T> for RefOrOwned<'t, T> {
38 fn from(value: T) -> Self {
39 Self::Owned(value)
40 }
41}
42
43impl<'t, T> Deref for RefOrOwned<'t, T> {
44 type Target = T;
45
46 fn deref(&self) -> &Self::Target {
47 self.as_ref()
48 }
49}
50
51impl<'t, T: Display> Display for RefOrOwned<'t, T> {
52 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
53 self.as_ref().fmt(f)
54 }
55}