summaryrefslogtreecommitdiff
path: root/vendor/windows-core/src/imp/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/windows-core/src/imp/mod.rs')
-rw-r--r--vendor/windows-core/src/imp/mod.rs96
1 files changed, 96 insertions, 0 deletions
diff --git a/vendor/windows-core/src/imp/mod.rs b/vendor/windows-core/src/imp/mod.rs
new file mode 100644
index 00000000..036b540b
--- /dev/null
+++ b/vendor/windows-core/src/imp/mod.rs
@@ -0,0 +1,96 @@
+#[cfg(windows)]
+include!("windows.rs");
+
+mod can_into;
+mod com_bindings;
+mod ref_count;
+mod sha1;
+mod weak_ref_count;
+
+pub use can_into::*;
+pub use com_bindings::*;
+pub use ref_count::*;
+pub use sha1::*;
+pub use weak_ref_count::*;
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! interface_hierarchy {
+ ($child:ident, $parent:ty) => {
+ impl ::windows_core::imp::CanInto<$parent> for $child {}
+ impl ::core::convert::From<&$child> for &$parent {
+ fn from(value: &$child) -> Self {
+ unsafe { ::core::mem::transmute(value) }
+ }
+ }
+ impl ::core::convert::From<$child> for $parent {
+ fn from(value: $child) -> Self {
+ unsafe { ::core::mem::transmute(value) }
+ }
+ }
+ };
+ ($child:ident, $first:ty, $($rest:ty),+) => {
+ $crate::imp::interface_hierarchy!($child, $first);
+ $crate::imp::interface_hierarchy!($child, $($rest),+);
+ };
+}
+
+#[doc(hidden)]
+pub use interface_hierarchy;
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! required_hierarchy {
+ ($child:ident, $parent:ty) => {
+ impl ::windows_core::imp::CanInto<$parent> for $child { const QUERY: bool = true; }
+ };
+ ($child:ident, $first:ty, $($rest:ty),+) => {
+ $crate::imp::required_hierarchy!($child, $first);
+ $crate::imp::required_hierarchy!($child, $($rest),+);
+ };
+}
+
+#[doc(hidden)]
+pub use required_hierarchy;
+
+#[doc(hidden)]
+#[macro_export]
+macro_rules! define_interface {
+ ($name:ident, $vtbl:ident, $iid:literal) => {
+ #[repr(transparent)]
+ #[derive(::core::cmp::PartialEq, ::core::cmp::Eq, ::core::clone::Clone)]
+ pub struct $name(::windows_core::IUnknown);
+ unsafe impl ::windows_core::Interface for $name {
+ type Vtable = $vtbl;
+ const IID: ::windows_core::GUID = ::windows_core::GUID::from_u128($iid);
+ }
+ impl ::core::fmt::Debug for $name {
+ fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
+ f.debug_tuple(stringify!($name))
+ .field(&::windows_core::Interface::as_raw(self))
+ .finish()
+ }
+ }
+ };
+ ($name:ident, $vtbl:ident) => {
+ #[repr(transparent)]
+ #[derive(::core::cmp::PartialEq, ::core::cmp::Eq, ::core::clone::Clone)]
+ pub struct $name(::core::ptr::NonNull<::core::ffi::c_void>);
+ unsafe impl ::windows_core::Interface for $name {
+ type Vtable = $vtbl;
+ const IID: ::windows_core::GUID = ::windows_core::GUID::zeroed();
+ const UNKNOWN: bool = false;
+ }
+ impl ::core::fmt::Debug for $name {
+ fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
+ f.debug_tuple(stringify!($name)).field(&self.0).finish()
+ }
+ }
+ };
+}
+
+#[doc(hidden)]
+pub use define_interface;
+
+#[doc(hidden)]
+pub use alloc::boxed::Box;