1#[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}