1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use core::ops::{Deref, DerefMut};
pub enum Cow<'a, T> {
Owned(T),
Borrowed(&'a T),
}
impl<'a, T> Deref for Cow<'a, T> {
type Target = T;
fn deref(&self) -> &T {
match self {
Cow::Borrowed(t) => t,
Cow::Owned(t) => &t,
}
}
}
impl<'a, T> DerefMut for Cow<'a, T>
where
T: Clone,
{
fn deref_mut(&mut self) -> &mut Self::Target {
if let Cow::Borrowed(t) = self {
*self = Cow::Owned(t.clone())
}
if let Cow::Owned(ref mut t) = self {
t
} else {
unreachable!()
}
}
}