use crate::Yoke;
use crate::Yokeable;
#[cfg(feature = "alloc")]
use alloc::borrow::{Cow, ToOwned};
#[cfg(feature = "alloc")]
use alloc::boxed::Box;
#[cfg(feature = "alloc")]
use alloc::rc::Rc;
#[cfg(feature = "alloc")]
use alloc::string::String;
pub trait ZeroCopyFrom<C: ?Sized>: for<'a> Yokeable<'a> {
fn zero_copy_from<'b>(cart: &'b C) -> <Self as Yokeable<'b>>::Output;
}
impl<'b, 's, Y: ZeroCopyFrom<C> + for<'a> Yokeable<'a>, C: ?Sized> Yoke<Y, &'b C> {
pub fn attach_to_borrowed_cart(cart: &'b C) -> Self {
Yoke::<Y, &'b C>::attach_to_cart_badly(cart, Y::zero_copy_from)
}
}
#[cfg(feature = "alloc")]
impl<'b, 's, Y: ZeroCopyFrom<C> + for<'a> Yokeable<'a>, C: ?Sized> Yoke<Y, Box<C>> {
pub fn attach_to_box_cart(cart: Box<C>) -> Self {
Yoke::<Y, Box<C>>::attach_to_cart_badly(cart, Y::zero_copy_from)
}
}
#[cfg(feature = "alloc")]
impl<'b, 's, Y: ZeroCopyFrom<C> + for<'a> Yokeable<'a>, C: ?Sized> Yoke<Y, Rc<C>> {
pub fn attach_to_rc_cart(cart: Rc<C>) -> Self {
Yoke::<Y, Rc<C>>::attach_to_cart_badly(cart, Y::zero_copy_from)
}
}
#[cfg(feature = "alloc")]
impl ZeroCopyFrom<str> for Cow<'static, str> {
fn zero_copy_from<'b>(cart: &'b str) -> Cow<'b, str> {
Cow::Borrowed(cart)
}
}
#[cfg(feature = "alloc")]
impl ZeroCopyFrom<String> for Cow<'static, str> {
fn zero_copy_from<'b>(cart: &'b String) -> Cow<'b, str> {
Cow::Borrowed(cart)
}
}
impl ZeroCopyFrom<str> for &'static str {
fn zero_copy_from<'b>(cart: &'b str) -> &'b str {
cart
}
}
#[cfg(feature = "alloc")]
impl ZeroCopyFrom<String> for &'static str {
fn zero_copy_from<'b>(cart: &'b String) -> &'b str {
cart
}
}
impl<C, T: ZeroCopyFrom<C>> ZeroCopyFrom<Option<C>> for Option<T> {
fn zero_copy_from<'b>(cart: &'b Option<C>) -> Option<<T as Yokeable<'b>>::Output> {
cart.as_ref()
.map(|c| <T as ZeroCopyFrom<C>>::zero_copy_from(c))
}
}
impl<C1, T1: ZeroCopyFrom<C1>, C2, T2: ZeroCopyFrom<C2>> ZeroCopyFrom<(C1, C2)> for (T1, T2) {
fn zero_copy_from<'b>(
cart: &'b (C1, C2),
) -> (<T1 as Yokeable<'b>>::Output, <T2 as Yokeable<'b>>::Output) {
(
<T1 as ZeroCopyFrom<C1>>::zero_copy_from(&cart.0),
<T2 as ZeroCopyFrom<C2>>::zero_copy_from(&cart.1),
)
}
}
#[cfg(feature = "alloc")]
impl<B: ToOwned + ?Sized + 'static> ZeroCopyFrom<Cow<'_, B>> for Cow<'static, B> {
fn zero_copy_from<'b>(cart: &'b Cow<'_, B>) -> Cow<'b, B> {
Cow::Borrowed(cart)
}
}
impl ZeroCopyFrom<&'_ str> for &'static str {
fn zero_copy_from<'b>(cart: &'b &'_ str) -> &'b str {
cart
}
}
impl<T> ZeroCopyFrom<[T]> for &'static [T] {
fn zero_copy_from<'b>(cart: &'b [T]) -> &'b [T] {
cart
}
}