as_is/foreign/
cow.rs

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}