Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  either.rs   Sprache: unbekannt

 
// 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 ).

//! Types to enable polymorphic carts.

use crate::CloneableCart;

use core::ops::Deref;
use stable_deref_trait::StableDeref;

/// A cart that can be one type or the other. Enables ergonomic polymorphic carts.
///
/// `EitherCart` enables yokes originating from different data sources and therefore
/// having different cart types to be merged into the same yoke type, but still being
/// able to recover the original cart type if necessary.
///
/// All relevant Cart traits are implemented for `EitherCart`, and carts can be
/// safely wrapped in an `EitherCart`.
///
/// Also see [`Yoke::erase_box_cart()`](crate::Yoke::erase_box_cart).
///
/// # Examples
///
/// ```
/// use std::rc::Rc;
/// use yoke::either::EitherCart;
/// use yoke::Yoke;
///
/// let y1: Yoke<&'static str, Rc<str>> =
///     Yoke::attach_to_zero_copy_cart("reference counted hello world".into());
///
/// let y2: Yoke<&'static str, &str> = Yoke::attach_to_zero_copy_cart("borrowed hello world");
///
/// type CombinedYoke<'a> = Yoke<&'static str, EitherCart<Rc<str>, &'a str>>;
///
/// // Both yokes can be combined into a single yoke type despite different carts
/// let y3: CombinedYoke = y1.wrap_cart_in_either_a();
/// let y4: CombinedYoke = y2.wrap_cart_in_either_b();
///
/// assert_eq!(*y3.get(), "reference counted hello world");
/// assert_eq!(*y4.get(), "borrowed hello world");
///
/// // The resulting yoke is cloneable if both cart types implement CloneableCart
/// let y5 = y4.clone();
/// assert_eq!(*y5.get(), "borrowed hello world");
/// ```
#[derive(Clone, PartialEq, Eq, Debug)]
#[allow(clippy::exhaustive_enums)] // stable
pub enum EitherCart<C0, C1> {
    A(C0),
    B(C1),
}

impl<C0, C1, T> Deref for EitherCart<C0, C1>
where
    C0: Deref<Target = T>,
    C1: Deref<Target = T>,
{
    type Target = T;
    fn deref(&self) -> &T {
        use EitherCart::*;
        match self {
            A(a) => a.deref(),
            B(b) => b.deref(),
        }
    }
}

// Safe because both sub-types implement the trait.
unsafe impl<C0, C1, T> StableDeref for EitherCart<C0, C1>
where
    C0: StableDeref,
    C1: StableDeref,
    C0: Deref<Target = T>,
    C1: Deref<Target = T>,
{
}

// Safe because both sub-types implement the trait.
unsafe impl<C0, C1> CloneableCart for EitherCart<C0, C1>
where
    C0: CloneableCart,
    C1: CloneableCart,
{
}

[ Dauer der Verarbeitung: 0.21 Sekunden  (vorverarbeitet)  ]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge