summaryrefslogtreecommitdiff
path: root/vendor/windows-core/src/out_ref.rs
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-02 18:36:06 -0600
committermo khan <mo@mokhan.ca>2025-07-02 18:36:06 -0600
commit8cdfa445d6629ffef4cb84967ff7017654045bc2 (patch)
tree22f0b0907c024c78d26a731e2e1f5219407d8102 /vendor/windows-core/src/out_ref.rs
parent4351c74c7c5f97156bc94d3a8549b9940ac80e3f (diff)
chore: add vendor directory
Diffstat (limited to 'vendor/windows-core/src/out_ref.rs')
-rw-r--r--vendor/windows-core/src/out_ref.rs31
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) }
+ }
+}