evobench_tools/utillib/
ref_or_owned.rs

1//! Stupid. Cow doesn't work for clonable types that don't have their
2//! own borrows? I don't understand why. Just do my own now.
3
4use 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}