ref_cast/
custom.rs

1// Not public API. Use #[derive(RefCastCustom)] and #[ref_cast_custom].
2#[doc(hidden)]
3pub unsafe trait RefCastCustom<From: ?Sized> {
4    type CurrentCrate;
5    fn __static_assert() {}
6}
7
8#[doc(hidden)]
9pub unsafe trait RefCastOkay<From>: Sealed<From> {
10    type CurrentCrate;
11    type Target: ?Sized;
12}
13
14unsafe impl<'a, From, To> RefCastOkay<&'a From> for &'a To
15where
16    From: ?Sized,
17    To: ?Sized + RefCastCustom<From>,
18{
19    type CurrentCrate = To::CurrentCrate;
20    type Target = To;
21}
22
23unsafe impl<'a, From, To> RefCastOkay<&'a mut From> for &'a mut To
24where
25    From: ?Sized,
26    To: ?Sized + RefCastCustom<From>,
27{
28    type CurrentCrate = To::CurrentCrate;
29    type Target = To;
30}
31
32#[doc(hidden)]
33pub trait Sealed<From> {}
34
35impl<'a, From, To> Sealed<&'a From> for &'a To
36where
37    From: ?Sized,
38    To: ?Sized + RefCastCustom<From>,
39{
40}
41
42impl<'a, From, To> Sealed<&'a mut From> for &'a mut To
43where
44    From: ?Sized,
45    To: ?Sized + RefCastCustom<From>,
46{
47}
48
49#[doc(hidden)]
50pub type CurrentCrate<From, To> = <To as RefCastOkay<From>>::CurrentCrate;
51
52#[doc(hidden)]
53pub fn ref_cast_custom<From, To>(_arg: From)
54where
55    To: RefCastOkay<From>,
56{
57}