blob: 1bc2922dadec24385871c1056572df044067c380 [file] [log] [blame] [edit]
#![allow(non_upper_case_globals)]
macro_rules! flags {
($name:ident, $size:ty) => {
#[derive(Default, Copy, Clone, PartialEq, Eq, Debug, Ord, PartialOrd)]
pub struct $name(pub $size);
impl $name {
pub fn contains(&self, contains: Self) -> bool {
*self & contains == contains
}
}
impl std::ops::BitOr for $name {
type Output = Self;
fn bitor(self, other: Self) -> Self {
Self(self.0 | other.0)
}
}
impl std::ops::BitAnd for $name {
type Output = Self;
fn bitand(self, other: Self) -> Self {
Self(self.0 & other.0)
}
}
impl std::ops::BitOrAssign for $name {
fn bitor_assign(&mut self, other: Self) {
self.0.bitor_assign(other.0)
}
}
impl std::ops::BitAndAssign for $name {
fn bitand_assign(&mut self, other: Self) {
self.0.bitand_assign(other.0)
}
}
impl std::ops::Not for $name {
type Output = Self;
fn not(self) -> Self {
Self(self.0.not())
}
}
};
}
flags!(FieldAttributes, u16);
impl FieldAttributes {
pub const Private: Self = Self(0x1);
pub const Public: Self = Self(0x6);
pub const Literal: Self = Self(0x40);
pub const Static: Self = Self(0x10);
pub const SpecialName: Self = Self(0x200);
pub const RTSpecialName: Self = Self(0x400);
pub const HasDefault: Self = Self(0x8000);
}
flags!(MethodAttributes, u16);
impl MethodAttributes {
pub const Abstract: Self = Self(0x400);
pub const HideBySig: Self = Self(0x80);
pub const NewSlot: Self = Self(0x100);
pub const Public: Self = Self(0x6);
pub const SpecialName: Self = Self(0x800);
pub const Virtual: Self = Self(0x40);
}
flags!(MethodImplAttributes, u16);
impl MethodImplAttributes {
pub const PreserveSig: Self = Self(0x80);
}
// These are not really ECMA-335 attributes but instead the flags found in the method signature.
flags!(MethodCallAttributes, u8);
impl MethodCallAttributes {
pub const HASTHIS: Self = Self(0x20);
pub const VARARG: Self = Self(0x05);
}
flags!(ParamAttributes, u16);
impl ParamAttributes {
pub const In: Self = Self(0x1);
pub const Out: Self = Self(0x2);
pub const Optional: Self = Self(0x10);
}
flags!(PInvokeAttributes, usize);
impl PInvokeAttributes {
pub const SupportsLastError: Self = Self(0x40);
pub const CallConvPlatformapi: Self = Self(0x100);
pub const CallConvCdecl: Self = Self(0x200);
pub const CallConvStdcall: Self = Self(0x300);
pub const CallConvThiscall: Self = Self(0x400);
pub const CallConvFastcall: Self = Self(0x500);
}
flags!(TypeAttributes, u32);
impl TypeAttributes {
pub const Public: Self = Self(0x1);
pub const ExplicitLayout: Self = Self(0x10);
pub const Abstract: Self = Self(0x80);
pub const Sealed: Self = Self(0x100);
pub const WindowsRuntime: Self = Self(0x4000);
pub const Interface: Self = Self(0x20);
pub const SequentialLayout: Self = Self(0x8);
pub const Import: Self = Self(0x1000);
}
flags!(AssemblyFlags, u32);
impl AssemblyFlags {
pub const WindowsRuntime: Self = Self(0x200);
}