bump_scope/
no_drop.rs

1/// This trait marks types that don't need dropping.
2///
3/// This trait is a best effort for modeling such a constraint.
4/// It is not implemented for all types that don't need dropping.
5///
6/// Specifically `&mut T` types don't implement `NoDrop` but definitely would if it were possible.
7///
8/// Every `T where T: Copy` and every `[T] where T: NoDrop` automatically implements `NoDrop`.
9///
10/// It is used as a bound for [`BumpBox`]'s [`into_ref`] and [`into_mut`] so you don't accidentally omit a drop that does matter.
11///
12/// [`BumpBox`]: crate::BumpBox
13/// [`into_ref`]: crate::BumpBox::into_ref
14/// [`into_mut`]: crate::BumpBox::into_mut
15pub trait NoDrop {}
16
17impl NoDrop for str {}
18impl<T: Copy> NoDrop for T {}
19impl<T: NoDrop> NoDrop for [T] {}
20
21impl NoDrop for core::ffi::CStr {}
22
23#[cfg(feature = "std")]
24mod std_impl {
25    use super::NoDrop;
26
27    impl NoDrop for std::ffi::OsStr {}
28    impl NoDrop for std::path::Path {}
29}