summaryrefslogtreecommitdiff
path: root/vendor/ref-cast/src/custom.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ref-cast/src/custom.rs')
-rw-r--r--vendor/ref-cast/src/custom.rs57
1 files changed, 57 insertions, 0 deletions
diff --git a/vendor/ref-cast/src/custom.rs b/vendor/ref-cast/src/custom.rs
new file mode 100644
index 00000000..76725bcf
--- /dev/null
+++ b/vendor/ref-cast/src/custom.rs
@@ -0,0 +1,57 @@
+// Not public API. Use #[derive(RefCastCustom)] and #[ref_cast_custom].
+#[doc(hidden)]
+pub unsafe trait RefCastCustom<From: ?Sized> {
+ type CurrentCrate;
+ fn __static_assert() {}
+}
+
+#[doc(hidden)]
+pub unsafe trait RefCastOkay<From>: Sealed<From> {
+ type CurrentCrate;
+ type Target: ?Sized;
+}
+
+unsafe impl<'a, From, To> RefCastOkay<&'a From> for &'a To
+where
+ From: ?Sized,
+ To: ?Sized + RefCastCustom<From>,
+{
+ type CurrentCrate = To::CurrentCrate;
+ type Target = To;
+}
+
+unsafe impl<'a, From, To> RefCastOkay<&'a mut From> for &'a mut To
+where
+ From: ?Sized,
+ To: ?Sized + RefCastCustom<From>,
+{
+ type CurrentCrate = To::CurrentCrate;
+ type Target = To;
+}
+
+#[doc(hidden)]
+pub trait Sealed<From> {}
+
+impl<'a, From, To> Sealed<&'a From> for &'a To
+where
+ From: ?Sized,
+ To: ?Sized + RefCastCustom<From>,
+{
+}
+
+impl<'a, From, To> Sealed<&'a mut From> for &'a mut To
+where
+ From: ?Sized,
+ To: ?Sized + RefCastCustom<From>,
+{
+}
+
+#[doc(hidden)]
+pub type CurrentCrate<From, To> = <To as RefCastOkay<From>>::CurrentCrate;
+
+#[doc(hidden)]
+pub fn ref_cast_custom<From, To>(_arg: From)
+where
+ To: RefCastOkay<From>,
+{
+}