use VK_NULL_HANDLE; use std::{borrow, fmt, ops}; #[repr(C)] pub struct Handle(*mut T); impl Handle { pub fn new(value: T) -> Self { let ptr = Box::into_raw(Box::new(value)); Handle(ptr) } pub fn unwrap(self) -> Box { unsafe { Box::from_raw(self.0) } } pub fn is_null(&self) -> bool { self.0 == VK_NULL_HANDLE as *mut T } } impl Clone for Handle { fn clone(&self) -> Self { Handle(self.0) } } impl Copy for Handle {} impl ops::Deref for Handle { type Target = T; fn deref(&self) -> &T { unsafe { &*self.0 } } } impl ops::DerefMut for Handle { fn deref_mut(&mut self) -> &mut T { unsafe { &mut *self.0 } } } impl borrow::Borrow for Handle { fn borrow(&self) -> &T { unsafe { &*self.0 } } } impl fmt::Debug for Handle { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "Handle({:p})", self.0) } } #[cfg(feature = "dispatch")] pub use self::dispatch::DispatchHandle; #[cfg(not(feature = "dispatch"))] pub type DispatchHandle = Handle; #[cfg(feature = "dispatch")] mod dispatch { const ICD_LOADER_MAGIC: u32 = 0x01CDC0DE; #[repr(C)] pub struct DispatchHandle(u32, super::Handle); impl DispatchHandle { pub fn new(value: T) -> Self { DispatchHandle(ICD_LOADER_MAGIC, super::Handle::new(value)) } pub fn unwrap(self) -> Box { self.1.unwrap() } pub fn is_null(&self) -> bool { self.1.is_null() } } impl Clone for DispatchHandle { fn clone(&self) -> Self { DispatchHandle(self.0, self.1) } } impl Copy for DispatchHandle {} impl ops::Deref for DispatchHandle { type Target = T; fn deref(&self) -> &T { self.1.deref() } } impl ops::DerefMut for DispatchHandle { fn deref_mut(&mut self) -> &mut T { self.1.deref_mut() } } impl borrow::Borrow for DispatchHandle { fn borrow(&self) -> &T { self.1.borrow() } } impl fmt::Debug for DispatchHandle { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { write!(formatter, "DispatchHandle({:p})", (self.1).0) } } }