| #[macro_export] |
| macro_rules! vk_bitflags_wrapped { |
| ($ name : ident , $ flag_type : ty) => { |
| impl Default for $name { |
| fn default() -> Self { |
| Self(0) |
| } |
| } |
| impl $name { |
| #[inline] |
| pub const fn empty() -> Self { |
| Self(0) |
| } |
| #[inline] |
| pub const fn from_raw(x: $flag_type) -> Self { |
| Self(x) |
| } |
| #[inline] |
| pub const fn as_raw(self) -> $flag_type { |
| self.0 |
| } |
| #[inline] |
| pub const fn is_empty(self) -> bool { |
| self.0 == Self::empty().0 |
| } |
| #[inline] |
| pub const fn intersects(self, other: Self) -> bool { |
| !Self(self.0 & other.0).is_empty() |
| } |
| #[doc = r" Returns whether `other` is a subset of `self`"] |
| #[inline] |
| pub const fn contains(self, other: Self) -> bool { |
| self.0 & other.0 == other.0 |
| } |
| } |
| impl ::std::ops::BitOr for $name { |
| type Output = Self; |
| #[inline] |
| fn bitor(self, rhs: Self) -> Self { |
| Self(self.0 | rhs.0) |
| } |
| } |
| impl ::std::ops::BitOrAssign for $name { |
| #[inline] |
| fn bitor_assign(&mut self, rhs: Self) { |
| *self = *self | rhs |
| } |
| } |
| impl ::std::ops::BitAnd for $name { |
| type Output = Self; |
| #[inline] |
| fn bitand(self, rhs: Self) -> Self { |
| Self(self.0 & rhs.0) |
| } |
| } |
| impl ::std::ops::BitAndAssign for $name { |
| #[inline] |
| fn bitand_assign(&mut self, rhs: Self) { |
| *self = *self & rhs |
| } |
| } |
| impl ::std::ops::BitXor for $name { |
| type Output = Self; |
| #[inline] |
| fn bitxor(self, rhs: Self) -> Self { |
| Self(self.0 ^ rhs.0) |
| } |
| } |
| impl ::std::ops::BitXorAssign for $name { |
| #[inline] |
| fn bitxor_assign(&mut self, rhs: Self) { |
| *self = *self ^ rhs |
| } |
| } |
| impl ::std::ops::Not for $name { |
| type Output = Self; |
| #[inline] |
| fn not(self) -> Self { |
| Self(!self.0) |
| } |
| } |
| }; |
| } |
| #[macro_export] |
| macro_rules! handle_nondispatchable { |
| ($ name : ident , $ ty : ident) => { |
| handle_nondispatchable!($name, $ty, doc = ""); |
| }; |
| ($ name : ident , $ ty : ident , $ doc_link : meta) => { |
| #[repr(transparent)] |
| #[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Hash, Default)] |
| #[$doc_link] |
| pub struct $name(u64); |
| impl Handle for $name { |
| const TYPE: ObjectType = ObjectType::$ty; |
| fn as_raw(self) -> u64 { |
| self.0 |
| } |
| fn from_raw(x: u64) -> Self { |
| Self(x) |
| } |
| } |
| impl $name { |
| pub const fn null() -> Self { |
| Self(0) |
| } |
| } |
| impl fmt::Pointer for $name { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| write!(f, "0x{:x}", self.0) |
| } |
| } |
| impl fmt::Debug for $name { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| write!(f, "0x{:x}", self.0) |
| } |
| } |
| }; |
| } |
| #[macro_export] |
| macro_rules! define_handle { |
| ($ name : ident , $ ty : ident) => { |
| define_handle!($name, $ty, doc = ""); |
| }; |
| ($ name : ident , $ ty : ident , $ doc_link : meta) => { |
| #[repr(transparent)] |
| #[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Hash)] |
| #[$doc_link] |
| pub struct $name(*mut u8); |
| impl Default for $name { |
| fn default() -> Self { |
| Self::null() |
| } |
| } |
| impl Handle for $name { |
| const TYPE: ObjectType = ObjectType::$ty; |
| fn as_raw(self) -> u64 { |
| self.0 as u64 |
| } |
| fn from_raw(x: u64) -> Self { |
| Self(x as _) |
| } |
| } |
| unsafe impl Send for $name {} |
| unsafe impl Sync for $name {} |
| impl $name { |
| pub const fn null() -> Self { |
| Self(::std::ptr::null_mut()) |
| } |
| } |
| impl fmt::Pointer for $name { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| fmt::Pointer::fmt(&self.0, f) |
| } |
| } |
| impl fmt::Debug for $name { |
| fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| fmt::Debug::fmt(&self.0, f) |
| } |
| } |
| }; |
| } |