1#![cfg(feature = "alloc")]
2
3use crate::{AsIs, BorrowAsIs, Is, IsCow, Owned};
4use alloc::borrow::{Borrow, Cow, ToOwned};
5
6impl<T> BorrowAsIs for Cow<'_, T>
7where
8 T: ?Sized + BorrowAsIs<Is = T> + ToOwned,
9{
10 type Is = T;
11
12 fn borrow_or_clone<B>(&self) -> IsCow<'_, B>
13 where
14 Self::Is: Borrow<B>,
15 B: ?Sized + ToOwned<Owned = Owned<Self>>,
16 {
17 (**self).borrow_or_clone()
18 }
19}
20
21impl<T> AsIs for Cow<'_, T>
22where
23 T: ?Sized + BorrowAsIs<Is = T> + ToOwned,
24{
25 fn as_is<'a>(self) -> Is<'a, T>
26 where
27 Self: 'a,
28 {
29 match self {
30 Cow::Owned(x) => Is::Owned(x),
31 Cow::Borrowed(x) => match x.borrow_or_clone() {
32 IsCow::Owned(x) => Is::Owned(x),
33 IsCow::Borrowed(_) => Is::Borrowed(x),
34 },
35 }
36 }
37}