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
37impl 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
50impl<'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
67impl 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}