diff options
Diffstat (limited to 'vendor/windows-core/src/out_ref.rs')
| -rw-r--r-- | vendor/windows-core/src/out_ref.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/vendor/windows-core/src/out_ref.rs b/vendor/windows-core/src/out_ref.rs new file mode 100644 index 00000000..24ba06ca --- /dev/null +++ b/vendor/windows-core/src/out_ref.rs @@ -0,0 +1,31 @@ +use super::*; + +/// A borrowed type with the same memory layout as the type itself that can be used to construct ABI-compatible function signatures. +/// +/// This is a mutable version of [Ref] meant to support out parameters. +#[repr(transparent)] +pub struct OutRef<'a, T: Type<T>>(*mut T::Abi, core::marker::PhantomData<&'a T>); + +impl<T: Type<T>> OutRef<'_, T> { + /// Returns `true` if the argument is null. + pub fn is_null(&self) -> bool { + self.0.is_null() + } + + /// Overwrites a memory location with the given value without reading or dropping the old value. + pub fn write(self, value: T::Default) -> Result<()> { + if self.0.is_null() { + Err(Error::from_hresult(imp::E_POINTER)) + } else { + unsafe { *self.0 = core::mem::transmute_copy(&value) } + core::mem::forget(value); + Ok(()) + } + } +} + +impl<'a, T: Type<T>> From<&'a mut T::Default> for OutRef<'a, T> { + fn from(from: &'a mut T::Default) -> Self { + unsafe { core::mem::transmute(from) } + } +} |
