Skip to main content

yazi_shared/pool/
cow.rs

1use std::ops::Deref;
2
3use crate::pool::{Pool, Symbol};
4
5pub enum SymbolCow<'a, T: ?Sized> {
6	Borrowed(&'a T),
7	Owned(Symbol<T>),
8}
9
10impl<T: ?Sized> Clone for SymbolCow<'_, T> {
11	fn clone(&self) -> Self {
12		match self {
13			Self::Borrowed(t) => Self::Borrowed(t),
14			Self::Owned(t) => Self::Owned(t.clone()),
15		}
16	}
17}
18
19impl AsRef<[u8]> for SymbolCow<'_, [u8]> {
20	fn as_ref(&self) -> &[u8] {
21		match self {
22			Self::Borrowed(b) => b,
23			Self::Owned(b) => b.as_ref(),
24		}
25	}
26}
27
28impl AsRef<str> for SymbolCow<'_, str> {
29	fn as_ref(&self) -> &str {
30		match self {
31			Self::Borrowed(s) => s,
32			Self::Owned(s) => s.as_ref(),
33		}
34	}
35}
36
37// --- Deref
38impl Deref for SymbolCow<'_, [u8]> {
39	type Target = [u8];
40
41	fn deref(&self) -> &Self::Target { self.as_ref() }
42}
43
44impl Deref for SymbolCow<'_, str> {
45	type Target = str;
46
47	fn deref(&self) -> &Self::Target { self.as_ref() }
48}
49
50// --- From
51impl<'a, T: ?Sized> From<&'a T> for SymbolCow<'a, T> {
52	fn from(value: &'a T) -> Self { Self::Borrowed(value) }
53}
54
55impl<T: ?Sized> From<Symbol<T>> for SymbolCow<'_, T> {
56	fn from(value: Symbol<T>) -> Self { Self::Owned(value) }
57}
58
59impl From<SymbolCow<'_, [u8]>> for Symbol<[u8]> {
60	fn from(value: SymbolCow<'_, [u8]>) -> Self { value.into_owned() }
61}
62
63impl From<SymbolCow<'_, str>> for Symbol<str> {
64	fn from(value: SymbolCow<'_, str>) -> Self { value.into_owned() }
65}
66
67// --- Debug
68impl std::fmt::Debug for SymbolCow<'_, [u8]> {
69	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70		write!(f, "SymbolCow<[u8]>({:?})", self.as_ref())
71	}
72}
73
74impl std::fmt::Debug for SymbolCow<'_, str> {
75	fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
76		write!(f, "SymbolCow<str>({:?})", self.as_ref())
77	}
78}
79
80impl SymbolCow<'_, [u8]> {
81	pub fn into_owned(self) -> Symbol<[u8]> {
82		match self {
83			Self::Borrowed(t) => Pool::<[u8]>::intern(t),
84			Self::Owned(t) => t,
85		}
86	}
87}
88
89impl SymbolCow<'_, str> {
90	pub fn into_owned(self) -> Symbol<str> {
91		match self {
92			Self::Borrowed(t) => Pool::<str>::intern(t),
93			Self::Owned(t) => t,
94		}
95	}
96}