use crate::layout; /// Context necessary to answer the question "Are these types transmutable?". pub(crate) trait QueryContext { type Def: layout::Def; type Region: layout::Region; type Type: layout::Type; } #[cfg(test)] pub(crate) mod test { use std::marker::PhantomData; use super::QueryContext; pub(crate) struct UltraMinimal(PhantomData<(R, T)>); impl Default for UltraMinimal { fn default() -> Self { Self(PhantomData) } } #[derive(Debug, Hash, Eq, PartialEq, Clone, Copy)] pub(crate) enum Def { HasSafetyInvariants, NoSafetyInvariants, } impl crate::layout::Def for Def { fn has_safety_invariants(&self) -> bool { self == &Self::HasSafetyInvariants } } impl QueryContext for UltraMinimal where R: crate::layout::Region, T: crate::layout::Type, { type Def = Def; type Region = R; type Type = T; } } #[cfg(feature = "rustc")] mod rustc { use rustc_middle::ty::{Region, Ty, TyCtxt}; use super::*; impl<'tcx> super::QueryContext for TyCtxt<'tcx> { type Def = layout::rustc::Def<'tcx>; type Region = Region<'tcx>; type Type = Ty<'tcx>; } }