pub trait Deref2 {
type Target<'a> where Self: 'a;
fn deref2(&self) -> Self::Target<'_>;
}
pub macro impl_deref2_from_deref($([$($impl_params:tt)*])? ($($impl_ty:tt)*)) {
impl$(<$($impl_params)*>)? Deref2 for $($impl_ty)* {
type Target<'a> = &'a <Self as ::std::ops::Deref>::Target where Self: 'a;
fn deref2(&self) -> Self::Target<'_> {
::std::ops::Deref::deref(self)
}
}
}
pub macro impl_stable_deref2_from_deref($([$($impl_params:tt)*])? ($($impl_ty:tt)*)) {
impl_deref2_from_deref!($([$($impl_params)*])? ($($impl_ty)*));
unsafe impl$(<$($impl_params)*>)? StableDeref2 for $($impl_ty)* {}
}
pub macro impl_clone_stable_deref2_from_deref($([$($impl_params:tt)*])? ($($impl_ty:tt)*)) {
impl_stable_deref2_from_deref!($([$($impl_params)*])? ($($impl_ty)*));
unsafe impl$(<$($impl_params)*>)? CloneStableDeref2 for $($impl_ty)* {}
}
pub unsafe trait StableDeref2: Deref2 {}
pub unsafe trait CloneStableDeref2: StableDeref2 + Clone {}
use std::ffi::{CString, OsString};
use std::path::PathBuf;
use std::sync::{Arc, MutexGuard, RwLockReadGuard, RwLockWriteGuard};
use core::cell::{Ref, RefMut};
use std::rc::Rc;
impl_stable_deref2_from_deref!([T: ?Sized] (Box<T>));
impl_stable_deref2_from_deref!((String));
impl_stable_deref2_from_deref!((CString));
impl_stable_deref2_from_deref!((OsString));
impl_stable_deref2_from_deref!((PathBuf));
impl_clone_stable_deref2_from_deref!([T: ?Sized] (Rc<T>));
impl_clone_stable_deref2_from_deref!([T: ?Sized] (Arc<T>));
impl_stable_deref2_from_deref!(['b, T: ?Sized] (Ref<'b, T>));
impl_stable_deref2_from_deref!(['b, T: ?Sized] (RefMut<'b, T>));
impl_stable_deref2_from_deref!(['b, T: ?Sized] (MutexGuard<'b, T>));
impl_stable_deref2_from_deref!(['b, T: ?Sized] (RwLockReadGuard<'b, T>));
impl_stable_deref2_from_deref!(['b, T: ?Sized] (RwLockWriteGuard<'b, T>));
impl_clone_stable_deref2_from_deref!(['b, T: ?Sized] (&'b T));
impl_stable_deref2_from_deref!(['b, T: ?Sized] (&'b mut T));