blob: d876d9c06a359322bfe5f3e4fb03cff67f8e420b [file] [log] [blame]
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
use crate::trait_hack::YokeTraitHack;
use crate::Yoke;
use crate::Yokeable;
use core::ops::Deref;
use stable_deref_trait::StableDeref;
use crate::ZeroFrom;
impl<'zf, C: ?Sized, T> ZeroFrom<'zf, C> for YokeTraitHack<T>
where
T: ZeroFrom<'zf, C>,
{
#[inline]
fn zero_from(cart: &'zf C) -> Self {
YokeTraitHack(T::zero_from(cart))
}
}
impl<Y, C> Yoke<Y, C>
where
Y: for<'a> Yokeable<'a>,
for<'a> YokeTraitHack<<Y as Yokeable<'a>>::Output>: ZeroFrom<'a, <C as Deref>::Target>,
C: StableDeref + Deref,
<C as Deref>::Target: 'static,
{
/// Construct a [`Yoke`]`<Y, C>` from a cart implementing `StableDeref` by zero-copy cloning
/// the cart to `Y` and then yokeing that object to the cart.
///
/// The type `Y` must implement [`ZeroFrom`]`<C::Target>`. This trait is auto-implemented
/// on many common types and can be custom implemented or derived in order to make it easier
/// to construct a `Yoke`.
///
/// # Example
///
/// Attach to a cart:
///
/// ```
/// use std::borrow::Cow;
/// use yoke::Yoke;
///
/// let yoke = Yoke::<Cow<'static, str>, String>::attach_to_zero_copy_cart(
/// "demo".to_owned(),
/// );
///
/// assert_eq!("demo", yoke.get());
/// ```
pub fn attach_to_zero_copy_cart(cart: C) -> Self {
Yoke::<Y, C>::attach_to_cart(cart, |c| {
YokeTraitHack::<<Y as Yokeable>::Output>::zero_from(c).0
})
}
}