blob: ebebb3ef463cee581e4319e6c3e50a3ec7b76802 [file] [log] [blame]
Adrian Taylorf5dd5522020-04-13 16:50:14 -07001use crate::syntax::{ExternFn, Receiver, Ref, Signature, Slice, Ty1, Type};
David Tolnay7db73692019-10-20 14:51:12 -04002use std::hash::{Hash, Hasher};
David Tolnayc21b20a2020-03-15 23:25:32 -07003use std::mem;
David Tolnay9bfbea32020-04-22 18:12:43 -07004use std::ops::{Deref, DerefMut};
David Tolnay16448732020-03-18 12:39:36 -07005
6impl Deref for ExternFn {
7 type Target = Signature;
8
9 fn deref(&self) -> &Self::Target {
10 &self.sig
11 }
12}
David Tolnayc21b20a2020-03-15 23:25:32 -070013
David Tolnay9bfbea32020-04-22 18:12:43 -070014impl DerefMut for ExternFn {
15 fn deref_mut(&mut self) -> &mut Self::Target {
16 &mut self.sig
17 }
18}
19
David Tolnayc21b20a2020-03-15 23:25:32 -070020impl Hash for Type {
21 fn hash<H: Hasher>(&self, state: &mut H) {
22 mem::discriminant(self).hash(state);
23 match self {
24 Type::Ident(t) => t.hash(state),
25 Type::RustBox(t) => t.hash(state),
26 Type::UniquePtr(t) => t.hash(state),
27 Type::Ref(t) => t.hash(state),
28 Type::Str(t) => t.hash(state),
Myron Ahneba35cf2020-02-05 19:41:51 +070029 Type::RustVec(t) => t.hash(state),
David Tolnay4377a9e2020-04-24 15:20:26 -070030 Type::CxxVector(t) => t.hash(state),
David Tolnay417305a2020-03-18 13:54:00 -070031 Type::Fn(t) => t.hash(state),
Adrian Taylorf5dd5522020-04-13 16:50:14 -070032 Type::Slice(t) => t.hash(state),
33 Type::SliceRefU8(t) => t.hash(state),
David Tolnayc21b20a2020-03-15 23:25:32 -070034 Type::Void(_) => {}
35 }
36 }
37}
38
39impl Eq for Type {}
40
41impl PartialEq for Type {
42 fn eq(&self, other: &Type) -> bool {
43 match (self, other) {
44 (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
45 (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
46 (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
47 (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
48 (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
Myron Ahneba35cf2020-02-05 19:41:51 +070049 (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
David Tolnay4377a9e2020-04-24 15:20:26 -070050 (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
David Tolnay417305a2020-03-18 13:54:00 -070051 (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
Adrian Taylorf5dd5522020-04-13 16:50:14 -070052 (Type::Slice(lhs), Type::Slice(rhs)) => lhs == rhs,
53 (Type::SliceRefU8(lhs), Type::SliceRefU8(rhs)) => lhs == rhs,
David Tolnayc21b20a2020-03-15 23:25:32 -070054 (Type::Void(_), Type::Void(_)) => true,
55 (_, _) => false,
56 }
57 }
58}
David Tolnay7db73692019-10-20 14:51:12 -040059
60impl Eq for Ty1 {}
61
62impl PartialEq for Ty1 {
63 fn eq(&self, other: &Ty1) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070064 let Ty1 {
65 name,
66 langle: _,
67 inner,
68 rangle: _,
69 } = self;
70 let Ty1 {
71 name: name2,
72 langle: _,
73 inner: inner2,
74 rangle: _,
75 } = other;
76 name == name2 && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -040077 }
78}
79
80impl Hash for Ty1 {
81 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -070082 let Ty1 {
83 name,
84 langle: _,
85 inner,
86 rangle: _,
87 } = self;
88 name.hash(state);
89 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -040090 }
91}
92
93impl Eq for Ref {}
94
95impl PartialEq for Ref {
96 fn eq(&self, other: &Ref) -> bool {
David Tolnay35c82eb2020-03-18 16:48:28 -070097 let Ref {
98 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -070099 lifetime,
David Tolnay35c82eb2020-03-18 16:48:28 -0700100 mutability,
101 inner,
102 } = self;
103 let Ref {
104 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700105 lifetime: lifetime2,
David Tolnay35c82eb2020-03-18 16:48:28 -0700106 mutability: mutability2,
107 inner: inner2,
108 } = other;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700109 lifetime == lifetime2 && mutability.is_some() == mutability2.is_some() && inner == inner2
David Tolnay7db73692019-10-20 14:51:12 -0400110 }
111}
112
113impl Hash for Ref {
114 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnay35c82eb2020-03-18 16:48:28 -0700115 let Ref {
116 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700117 lifetime,
David Tolnay35c82eb2020-03-18 16:48:28 -0700118 mutability,
119 inner,
120 } = self;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700121 lifetime.hash(state);
David Tolnay35c82eb2020-03-18 16:48:28 -0700122 mutability.is_some().hash(state);
123 inner.hash(state);
David Tolnay7db73692019-10-20 14:51:12 -0400124 }
125}
David Tolnay417305a2020-03-18 13:54:00 -0700126
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700127impl Eq for Slice {}
128
129impl PartialEq for Slice {
130 fn eq(&self, other: &Slice) -> bool {
David Tolnayeb952ba2020-04-14 15:02:24 -0700131 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700132 let Slice {
133 bracket: _,
134 inner: inner2,
135 } = other;
136 inner == inner2
137 }
138}
139
140impl Hash for Slice {
141 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayeb952ba2020-04-14 15:02:24 -0700142 let Slice { bracket: _, inner } = self;
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700143 inner.hash(state);
144 }
145}
146
David Tolnay417305a2020-03-18 13:54:00 -0700147impl Eq for Signature {}
148
149impl PartialEq for Signature {
150 fn eq(&self, other: &Signature) -> bool {
151 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700152 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700153 fn_token: _,
154 receiver,
155 args,
156 ret,
157 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700158 paren_token: _,
159 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700160 } = self;
161 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700162 unsafety: unsafety2,
David Tolnay417305a2020-03-18 13:54:00 -0700163 fn_token: _,
164 receiver: receiver2,
165 args: args2,
166 ret: ret2,
167 throws: throws2,
David Tolnaye3a48152020-04-08 19:38:05 -0700168 paren_token: _,
169 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700170 } = other;
David Tolnaybdb576c2020-09-06 23:45:55 -0700171 unsafety.is_some() == unsafety2.is_some()
172 && receiver == receiver2
David Tolnaye3a48152020-04-08 19:38:05 -0700173 && ret == ret2
174 && throws == throws2
175 && args.len() == args2.len()
176 && args.iter().zip(args2).all(|(arg, arg2)| arg == arg2)
David Tolnay417305a2020-03-18 13:54:00 -0700177 }
178}
179
180impl Hash for Signature {
181 fn hash<H: Hasher>(&self, state: &mut H) {
182 let Signature {
David Tolnaybdb576c2020-09-06 23:45:55 -0700183 unsafety,
David Tolnay417305a2020-03-18 13:54:00 -0700184 fn_token: _,
185 receiver,
186 args,
187 ret,
188 throws,
David Tolnaye3a48152020-04-08 19:38:05 -0700189 paren_token: _,
190 throws_tokens: _,
David Tolnay417305a2020-03-18 13:54:00 -0700191 } = self;
David Tolnaybdb576c2020-09-06 23:45:55 -0700192 unsafety.is_some().hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700193 receiver.hash(state);
David Tolnaye3a48152020-04-08 19:38:05 -0700194 for arg in args {
195 arg.hash(state);
196 }
David Tolnay417305a2020-03-18 13:54:00 -0700197 ret.hash(state);
198 throws.hash(state);
199 }
200}
201
202impl Eq for Receiver {}
203
204impl PartialEq for Receiver {
205 fn eq(&self, other: &Receiver) -> bool {
David Tolnay417305a2020-03-18 13:54:00 -0700206 let Receiver {
David Tolnayfb6e3862020-04-20 01:33:23 -0700207 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700208 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700209 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700210 var: _,
211 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700212 shorthand: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700213 } = self;
214 let Receiver {
215 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700216 lifetime: lifetime2,
David Tolnay417305a2020-03-18 13:54:00 -0700217 mutability: mutability2,
David Tolnay05e11cc2020-04-20 02:13:56 -0700218 var: _,
219 ty: ty2,
David Tolnay62d360c2020-04-22 16:26:21 -0700220 shorthand: _,
David Tolnay417305a2020-03-18 13:54:00 -0700221 } = other;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700222 lifetime == lifetime2 && mutability.is_some() == mutability2.is_some() && ty == ty2
David Tolnay417305a2020-03-18 13:54:00 -0700223 }
224}
225
226impl Hash for Receiver {
227 fn hash<H: Hasher>(&self, state: &mut H) {
David Tolnayfb6e3862020-04-20 01:33:23 -0700228 let Receiver {
229 ampersand: _,
David Tolnay0bd50fa2020-04-22 15:31:33 -0700230 lifetime,
David Tolnayfb6e3862020-04-20 01:33:23 -0700231 mutability,
David Tolnay05e11cc2020-04-20 02:13:56 -0700232 var: _,
233 ty,
David Tolnay62d360c2020-04-22 16:26:21 -0700234 shorthand: _,
David Tolnayfb6e3862020-04-20 01:33:23 -0700235 } = self;
David Tolnay0bd50fa2020-04-22 15:31:33 -0700236 lifetime.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700237 mutability.is_some().hash(state);
David Tolnay05e11cc2020-04-20 02:13:56 -0700238 ty.hash(state);
David Tolnay417305a2020-03-18 13:54:00 -0700239 }
240}