| 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 | |
| 12 | use alloc::boxed::Box; |
| 13 | use alloc::rc::Rc; |
| 14 | use 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. |
| 21 | pub trait ErasedDestructor: 'static {} |
| 22 | impl<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.* |
| 29 | pub 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.* |
| 35 | pub 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.* |
| 41 | pub type ErasedBoxCart = Box<dyn ErasedDestructor>; |
| 42 | |