#![cfg_attr(not(feature = "std"), no_std)]
#![doc = include_str!("../README.md")]
extern crate alloc;
use core::{borrow::Borrow, ops::Deref};
use alloc::borrow::ToOwned;
mod like_impls;
pub enum Cow<'a, B: ?Sized + 'a, O = <B as ToOwned>::Owned> {
Borrowed(&'a B),
Owned(O),
}
impl<B: ?Sized + ToOwned> Cow<'_, B> {
pub fn to_mut(&mut self) -> &mut B::Owned {
match self {
Cow::Borrowed(borrowed) => {
*self = Self::Owned(borrowed.to_owned());
match self {
Cow::Borrowed(_) => unreachable!(),
Cow::Owned(owned) => owned,
}
},
Cow::Owned(owned) => owned,
}
}
pub fn into_owned(self) -> B::Owned {
match self {
Cow::Borrowed(borrowed) => borrowed.to_owned(),
Cow::Owned(owned) => owned,
}
}
}
impl<B: ?Sized + ToOwned<Owned = O>, O: Clone> Clone for Cow<'_, B, O> {
fn clone(&self) -> Self {
match self {
Self::Borrowed(borrowed) => Self::Borrowed(borrowed),
Self::Owned(owned) => Self::Owned(owned.clone()),
}
}
}
impl<B: ?Sized + ToOwned<Owned = O>, O: Borrow<B>> Deref for Cow<'_, B, O> {
type Target = B;
fn deref(&self) -> &Self::Target {
match self {
Cow::Borrowed(borrowed) => borrowed,
Cow::Owned(owned) => owned.borrow(),
}
}
}