#[cfg(windows)]
include!("windows.rs");
use alloc::boxed::Box;
mod agile;
#[cfg_attr(not(windows), allow(dead_code))]
mod bindings;
mod can_into;
mod delegate_box;
mod ref_count;
mod sha1;
mod weak_ref_count;
pub use crate::r#type::{
AbiType, CloneType, CopyType, InterfaceType, Type, TypeKind, ref_as_default,
};
pub use agile::*;
pub use bindings::*;
pub use can_into::*;
pub use delegate_box::*;
pub use ref_count::*;
pub use sha1::*;
pub use weak_ref_count::*;
#[inline]
#[allow(clippy::not_unsafe_ptr_arg_deref)]
pub fn encode_pointer(ptr: *const core::ffi::c_void) -> i64 {
#[cfg(windows)]
unsafe {
EncodePointer(ptr) as i64
}
#[cfg(not(windows))]
{
ptr as i64
}
}
#[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;
#[inline(always)]
#[doc(hidden)]
pub fn box_new<T>(value: T) -> Box<T> {
Box::new(value)
}
#[inline(always)]
#[doc(hidden)]
pub unsafe fn box_from_raw<T>(raw: *mut T) -> Box<T> {
unsafe { Box::from_raw(raw) }
}
#[inline(always)]
#[doc(hidden)]
pub fn box_into_raw<T>(b: Box<T>) -> *mut T {
Box::into_raw(b)
}