windows_metadata/writer/
codes.rs

1use super::*;
2
3macro_rules! code {
4    ($name:ident($size:literal) $(($table:ident, $code:literal))+) => {
5        #[derive(Clone, Copy, Eq, PartialEq, Hash)]
6        pub enum $name {
7            $($table(id::$table),)*
8        }
9        impl $name {
10            pub fn encode(&self) -> u32 {
11                match self {
12                    $(Self::$table(row) => (row.0.overflowing_add(1).0) << $size | $code,)*
13                }
14            }
15        }
16        impl Ord for $name {
17            fn cmp(&self, other: &Self) -> std::cmp::Ordering {
18                self.encode().cmp(&other.encode())
19            }
20        }
21
22        impl PartialOrd for $name {
23            fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
24                Some(self.cmp(other))
25            }
26        }
27    };
28}
29
30code! { TypeDefOrRef(2)
31    (TypeDef, 0)
32    (TypeRef, 1)
33    (TypeSpec, 2)
34}
35
36impl Default for TypeDefOrRef {
37    fn default() -> Self {
38        // This results in an encoded value of zero.
39        TypeDefOrRef::TypeDef(id::TypeDef(u32::MAX))
40    }
41}
42
43code! { ResolutionScope(2)
44    (Module, 0)
45    (ModuleRef, 1)
46    (AssemblyRef, 2)
47    (TypeRef, 3)
48}
49
50code! { HasAttribute(5)
51    (MethodDef, 0)
52    (Field, 1)
53    (TypeRef, 2)
54    (TypeDef, 3)
55    (Param, 4)
56    (InterfaceImpl, 5)
57    (MemberRef, 6)
58    (TypeSpec, 13)
59    (GenericParam, 19)
60}
61
62code! { AttributeType(3)
63    (MemberRef, 3)
64}
65
66code! { MemberRefParent(3)
67    (TypeRef, 1)
68}
69
70code! { HasConstant(2)
71    (Field, 0)
72}
73
74code! { MemberForwarded(1)
75    (MethodDef, 1)
76}
77
78code! { TypeOrMethodDef(1)
79    (TypeDef, 0)
80}