use super::*; use core::mem::transmute_copy; use core::mem::zeroed; /// Provides automatic parameter conversion in cases where the Windows API expects implicit conversion support. /// /// There is no need to implement this trait. Blanket implementations are provided for all applicable Windows types. pub trait Param::TypeKind>: Sized where T: Type, { #[doc(hidden)] unsafe fn param(self) -> ParamValue; } impl Param for Option<&T> where T: Type, { unsafe fn param(self) -> ParamValue { ParamValue::Borrowed(match self { Some(item) => transmute_copy(item), None => zeroed(), }) } } impl Param for &U where T: TypeKind + Clone, T: Interface, U: Interface, U: imp::CanInto, { unsafe fn param(self) -> ParamValue { if U::QUERY { self.cast() .map_or(ParamValue::Borrowed(zeroed()), |ok| ParamValue::Owned(ok)) } else { ParamValue::Borrowed(transmute_copy(self)) } } } impl Param for &T where T: TypeKind + Clone, { unsafe fn param(self) -> ParamValue { ParamValue::Borrowed(transmute_copy(self)) } } impl Param for U where T: TypeKind + Clone, U: TypeKind + Clone, U: imp::CanInto, { unsafe fn param(self) -> ParamValue { ParamValue::Owned(transmute_copy(&self)) } }