windows_metadata/writer/
codes.rs1use 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 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}