1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5//! This module contains helper types for erasing Cart types.
6//!
7//! See the docs of [`Yoke::erase_rc_cart()`](crate::Yoke::erase_rc_cart)
8//! and [`Yoke::erase_box_cart()`](crate::Yoke::erase_box_cart) for more info.
9//!
10//! ✨ *Enabled with the `alloc` Cargo feature.*
11
12use alloc::boxed::Box;
13use alloc::rc::Rc;
14use alloc::sync::Arc;
15
16/// Dummy trait that lets us `dyn Drop`
17///
18/// `dyn Drop` isn't legal (and doesn't make sense since `Drop` is not
19/// implement on all destructible types). However, all trait objects come with
20/// a destructor, so we can just use an empty trait to get a destructor object.
21pub trait ErasedDestructor: 'static {}
22impl<T: 'static> ErasedDestructor for T {}
23
24/// A type-erased Cart that has `Arc` semantics
25///
26/// See the docs of [`Yoke::erase_arc_cart()`](crate::Yoke::erase_rc_cart) for more info.
27///
28/// ✨ *Enabled with the `alloc` Cargo feature.*
29pub type ErasedArcCart = Arc<dyn ErasedDestructor + Send + Sync>;
30/// A type-erased Cart that has `Rc` semantics
31///
32/// See the docs of [`Yoke::erase_rc_cart()`](crate::Yoke::erase_rc_cart) for more info.
33///
34/// ✨ *Enabled with the `alloc` Cargo feature.*
35pub type ErasedRcCart = Rc<dyn ErasedDestructor>;
36/// A type-erased Cart that has `Box` semantics
37///
38/// See the docs of [`Yoke::erase_box_cart()`](crate::Yoke::erase_box_cart) for more info.
39///
40/// ✨ *Enabled with the `alloc` Cargo feature.*
41pub type ErasedBoxCart = Box<dyn ErasedDestructor>;
42