cxxbridge_macro/syntax/
impls.rs

1use crate::syntax::{
2    Array, ExternFn, Include, Lifetimes, Ptr, Receiver, Ref, Signature, SliceRef, Ty1, Type, Var,
3};
4use std::hash::{Hash, Hasher};
5use std::mem;
6use std::ops::{Deref, DerefMut};
7
8impl PartialEq for Include {
9    fn eq(&self, other: &Self) -> bool {
10        let Include {
11            cfg: _,
12            path,
13            kind,
14            begin_span: _,
15            end_span: _,
16        } = self;
17        let Include {
18            cfg: _,
19            path: path2,
20            kind: kind2,
21            begin_span: _,
22            end_span: _,
23        } = other;
24        path == path2 && kind == kind2
25    }
26}
27
28impl Deref for ExternFn {
29    type Target = Signature;
30
31    fn deref(&self) -> &Self::Target {
32        &self.sig
33    }
34}
35
36impl DerefMut for ExternFn {
37    fn deref_mut(&mut self) -> &mut Self::Target {
38        &mut self.sig
39    }
40}
41
42impl Hash for Type {
43    fn hash<H: Hasher>(&self, state: &mut H) {
44        mem::discriminant(self).hash(state);
45        match self {
46            Type::Ident(t) => t.hash(state),
47            Type::RustBox(t) => t.hash(state),
48            Type::UniquePtr(t) => t.hash(state),
49            Type::SharedPtr(t) => t.hash(state),
50            Type::WeakPtr(t) => t.hash(state),
51            Type::Ref(t) => t.hash(state),
52            Type::Ptr(t) => t.hash(state),
53            Type::Str(t) => t.hash(state),
54            Type::RustVec(t) => t.hash(state),
55            Type::CxxVector(t) => t.hash(state),
56            Type::Fn(t) => t.hash(state),
57            Type::SliceRef(t) => t.hash(state),
58            Type::Array(t) => t.hash(state),
59            Type::Void(_) => {}
60        }
61    }
62}
63
64impl Eq for Type {}
65
66impl PartialEq for Type {
67    fn eq(&self, other: &Self) -> bool {
68        match (self, other) {
69            (Type::Ident(lhs), Type::Ident(rhs)) => lhs == rhs,
70            (Type::RustBox(lhs), Type::RustBox(rhs)) => lhs == rhs,
71            (Type::UniquePtr(lhs), Type::UniquePtr(rhs)) => lhs == rhs,
72            (Type::SharedPtr(lhs), Type::SharedPtr(rhs)) => lhs == rhs,
73            (Type::WeakPtr(lhs), Type::WeakPtr(rhs)) => lhs == rhs,
74            (Type::Ref(lhs), Type::Ref(rhs)) => lhs == rhs,
75            (Type::Str(lhs), Type::Str(rhs)) => lhs == rhs,
76            (Type::RustVec(lhs), Type::RustVec(rhs)) => lhs == rhs,
77            (Type::CxxVector(lhs), Type::CxxVector(rhs)) => lhs == rhs,
78            (Type::Fn(lhs), Type::Fn(rhs)) => lhs == rhs,
79            (Type::SliceRef(lhs), Type::SliceRef(rhs)) => lhs == rhs,
80            (Type::Void(_), Type::Void(_)) => true,
81            (_, _) => false,
82        }
83    }
84}
85
86impl Eq for Lifetimes {}
87
88impl PartialEq for Lifetimes {
89    fn eq(&self, other: &Self) -> bool {
90        let Lifetimes {
91            lt_token: _,
92            lifetimes,
93            gt_token: _,
94        } = self;
95        let Lifetimes {
96            lt_token: _,
97            lifetimes: lifetimes2,
98            gt_token: _,
99        } = other;
100        lifetimes.iter().eq(lifetimes2)
101    }
102}
103
104impl Hash for Lifetimes {
105    fn hash<H: Hasher>(&self, state: &mut H) {
106        let Lifetimes {
107            lt_token: _,
108            lifetimes,
109            gt_token: _,
110        } = self;
111        lifetimes.len().hash(state);
112        for lifetime in lifetimes {
113            lifetime.hash(state);
114        }
115    }
116}
117
118impl Eq for Ty1 {}
119
120impl PartialEq for Ty1 {
121    fn eq(&self, other: &Self) -> bool {
122        let Ty1 {
123            name,
124            langle: _,
125            inner,
126            rangle: _,
127        } = self;
128        let Ty1 {
129            name: name2,
130            langle: _,
131            inner: inner2,
132            rangle: _,
133        } = other;
134        name == name2 && inner == inner2
135    }
136}
137
138impl Hash for Ty1 {
139    fn hash<H: Hasher>(&self, state: &mut H) {
140        let Ty1 {
141            name,
142            langle: _,
143            inner,
144            rangle: _,
145        } = self;
146        name.hash(state);
147        inner.hash(state);
148    }
149}
150
151impl Eq for Ref {}
152
153impl PartialEq for Ref {
154    fn eq(&self, other: &Self) -> bool {
155        let Ref {
156            pinned,
157            ampersand: _,
158            lifetime,
159            mutable,
160            inner,
161            pin_tokens: _,
162            mutability: _,
163        } = self;
164        let Ref {
165            pinned: pinned2,
166            ampersand: _,
167            lifetime: lifetime2,
168            mutable: mutable2,
169            inner: inner2,
170            pin_tokens: _,
171            mutability: _,
172        } = other;
173        pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && inner == inner2
174    }
175}
176
177impl Hash for Ref {
178    fn hash<H: Hasher>(&self, state: &mut H) {
179        let Ref {
180            pinned,
181            ampersand: _,
182            lifetime,
183            mutable,
184            inner,
185            pin_tokens: _,
186            mutability: _,
187        } = self;
188        pinned.hash(state);
189        lifetime.hash(state);
190        mutable.hash(state);
191        inner.hash(state);
192    }
193}
194
195impl Eq for Ptr {}
196
197impl PartialEq for Ptr {
198    fn eq(&self, other: &Ptr) -> bool {
199        let Ptr {
200            star: _,
201            mutable,
202            inner,
203            mutability: _,
204            constness: _,
205        } = self;
206        let Ptr {
207            star: _,
208            mutable: mutable2,
209            inner: inner2,
210            mutability: _,
211            constness: _,
212        } = other;
213        mutable == mutable2 && inner == inner2
214    }
215}
216
217impl Hash for Ptr {
218    fn hash<H: Hasher>(&self, state: &mut H) {
219        let Ptr {
220            star: _,
221            mutable,
222            inner,
223            mutability: _,
224            constness: _,
225        } = self;
226        mutable.hash(state);
227        inner.hash(state);
228    }
229}
230
231impl Eq for SliceRef {}
232
233impl PartialEq for SliceRef {
234    fn eq(&self, other: &Self) -> bool {
235        let SliceRef {
236            ampersand: _,
237            lifetime,
238            mutable,
239            bracket: _,
240            inner,
241            mutability: _,
242        } = self;
243        let SliceRef {
244            ampersand: _,
245            lifetime: lifetime2,
246            mutable: mutable2,
247            bracket: _,
248            inner: inner2,
249            mutability: _,
250        } = other;
251        lifetime == lifetime2 && mutable == mutable2 && inner == inner2
252    }
253}
254
255impl Hash for SliceRef {
256    fn hash<H: Hasher>(&self, state: &mut H) {
257        let SliceRef {
258            ampersand: _,
259            lifetime,
260            mutable,
261            bracket: _,
262            inner,
263            mutability: _,
264        } = self;
265        lifetime.hash(state);
266        mutable.hash(state);
267        inner.hash(state);
268    }
269}
270
271impl Eq for Array {}
272
273impl PartialEq for Array {
274    fn eq(&self, other: &Self) -> bool {
275        let Array {
276            bracket: _,
277            inner,
278            semi_token: _,
279            len,
280            len_token: _,
281        } = self;
282        let Array {
283            bracket: _,
284            inner: inner2,
285            semi_token: _,
286            len: len2,
287            len_token: _,
288        } = other;
289        inner == inner2 && len == len2
290    }
291}
292
293impl Hash for Array {
294    fn hash<H: Hasher>(&self, state: &mut H) {
295        let Array {
296            bracket: _,
297            inner,
298            semi_token: _,
299            len,
300            len_token: _,
301        } = self;
302        inner.hash(state);
303        len.hash(state);
304    }
305}
306
307impl Eq for Signature {}
308
309impl PartialEq for Signature {
310    fn eq(&self, other: &Self) -> bool {
311        let Signature {
312            asyncness,
313            unsafety,
314            fn_token: _,
315            generics: _,
316            receiver,
317            args,
318            ret,
319            throws,
320            paren_token: _,
321            throws_tokens: _,
322        } = self;
323        let Signature {
324            asyncness: asyncness2,
325            unsafety: unsafety2,
326            fn_token: _,
327            generics: _,
328            receiver: receiver2,
329            args: args2,
330            ret: ret2,
331            throws: throws2,
332            paren_token: _,
333            throws_tokens: _,
334        } = other;
335        asyncness.is_some() == asyncness2.is_some()
336            && unsafety.is_some() == unsafety2.is_some()
337            && receiver == receiver2
338            && ret == ret2
339            && throws == throws2
340            && args.len() == args2.len()
341            && args.iter().zip(args2).all(|(arg, arg2)| {
342                let Var {
343                    cfg: _,
344                    doc: _,
345                    attrs: _,
346                    visibility: _,
347                    name: _,
348                    colon_token: _,
349                    ty,
350                } = arg;
351                let Var {
352                    cfg: _,
353                    doc: _,
354                    attrs: _,
355                    visibility: _,
356                    name: _,
357                    colon_token: _,
358                    ty: ty2,
359                } = arg2;
360                ty == ty2
361            })
362    }
363}
364
365impl Hash for Signature {
366    fn hash<H: Hasher>(&self, state: &mut H) {
367        let Signature {
368            asyncness,
369            unsafety,
370            fn_token: _,
371            generics: _,
372            receiver,
373            args,
374            ret,
375            throws,
376            paren_token: _,
377            throws_tokens: _,
378        } = self;
379        asyncness.is_some().hash(state);
380        unsafety.is_some().hash(state);
381        receiver.hash(state);
382        for arg in args {
383            let Var {
384                cfg: _,
385                doc: _,
386                attrs: _,
387                visibility: _,
388                name: _,
389                colon_token: _,
390                ty,
391            } = arg;
392            ty.hash(state);
393        }
394        ret.hash(state);
395        throws.hash(state);
396    }
397}
398
399impl Eq for Receiver {}
400
401impl PartialEq for Receiver {
402    fn eq(&self, other: &Self) -> bool {
403        let Receiver {
404            pinned,
405            ampersand: _,
406            lifetime,
407            mutable,
408            var: _,
409            colon_token: _,
410            ty,
411            shorthand: _,
412            pin_tokens: _,
413            mutability: _,
414        } = self;
415        let Receiver {
416            pinned: pinned2,
417            ampersand: _,
418            lifetime: lifetime2,
419            mutable: mutable2,
420            var: _,
421            colon_token: _,
422            ty: ty2,
423            shorthand: _,
424            pin_tokens: _,
425            mutability: _,
426        } = other;
427        pinned == pinned2 && lifetime == lifetime2 && mutable == mutable2 && ty == ty2
428    }
429}
430
431impl Hash for Receiver {
432    fn hash<H: Hasher>(&self, state: &mut H) {
433        let Receiver {
434            pinned,
435            ampersand: _,
436            lifetime,
437            mutable,
438            var: _,
439            colon_token: _,
440            ty,
441            shorthand: _,
442            pin_tokens: _,
443            mutability: _,
444        } = self;
445        pinned.hash(state);
446        lifetime.hash(state);
447        mutable.hash(state);
448        ty.hash(state);
449    }
450}