strck/
partial_eq.rs

1//! Permutations of `PartialEq` between `Ck`, `Check`, `str`, and `String`.
2use crate::{Check, Ck, Invariant};
3
4// `Check`s don't need to have the same backing storage to be equal.
5impl<'a, I, B1, B2> PartialEq<Check<I, B2>> for &'a Check<I, B1>
6where
7    I: Invariant,
8    B1: AsRef<str>,
9    B2: AsRef<str>,
10{
11    fn eq(&self, other: &Check<I, B2>) -> bool {
12        self.as_str() == other.as_str()
13    }
14}
15
16impl<'a, I, B1, B2> PartialEq<&'a Check<I, B2>> for Check<I, B1>
17where
18    I: Invariant,
19    B1: AsRef<str>,
20    B2: AsRef<str>,
21{
22    fn eq(&self, other: &&'a Check<I, B2>) -> bool {
23        self.as_str() == other.as_str()
24    }
25}
26
27macro_rules! impl_partial_eq {
28    (<I> $a:ty = $b:ty) => {
29        impl<I: Invariant> PartialEq<$a> for $b {
30            fn eq(&self, other: &$a) -> bool {
31                AsRef::<str>::as_ref(self) == AsRef::<str>::as_ref(other)
32            }
33        }
34    };
35    (<I, B> $a:ty = $b:ty) => {
36        impl<I: Invariant, B: AsRef<str>> PartialEq<$a> for $b {
37            fn eq(&self, other: &$a) -> bool {
38                AsRef::<str>::as_ref(self) == AsRef::<str>::as_ref(other)
39            }
40        }
41    };
42    (<$lt:lifetime, I> $a:ty = $b:ty) => {
43        impl<$lt, I: Invariant> PartialEq<$a> for $b {
44            fn eq(&self, other: &$a) -> bool {
45                AsRef::<str>::as_ref(self) == AsRef::<str>::as_ref(other)
46            }
47        }
48    };
49    (<$lt:lifetime, I, B> $a:ty = $b:ty) => {
50        impl<$lt, I: Invariant, B: AsRef<str>> PartialEq<$a> for $b {
51            fn eq(&self, other: &$a) -> bool {
52                AsRef::<str>::as_ref(self) == AsRef::<str>::as_ref(other)
53            }
54        }
55    };
56}
57
58impl_partial_eq!(<'a, I> Ck<I> = &'a Ck<I>);
59impl_partial_eq!(<'a, I> &'a Ck<I> = Ck<I>);
60
61impl_partial_eq!(<I, B> Ck<I> = Check<I, B>);
62impl_partial_eq!(<I, B> Check<I, B> = Ck<I>);
63impl_partial_eq!(<'a, I, B> &'a Ck<I> = Check<I, B>);
64impl_partial_eq!(<'a, I, B> Check<I, B> = &'a Ck<I>);
65impl_partial_eq!(<'a, I, B> Ck<I> = &'a Check<I, B>);
66impl_partial_eq!(<'a, I, B> &'a Check<I, B> = Ck<I>);
67
68impl_partial_eq!(<I, B> str = Check<I, B>);
69impl_partial_eq!(<I, B> Check<I, B> = str);
70impl_partial_eq!(<'a, I, B> &'a str = Check<I, B>);
71impl_partial_eq!(<'a, I, B> Check<I, B> = &'a str);
72impl_partial_eq!(<'a, I, B> str = &'a Check<I, B>);
73impl_partial_eq!(<'a, I, B> &'a Check<I, B> = str);
74
75impl_partial_eq!(<I, B> String = Check<I, B>);
76impl_partial_eq!(<I, B> Check<I, B> = String);
77impl_partial_eq!(<'a, I, B> &'a String = Check<I, B>);
78impl_partial_eq!(<'a, I, B> Check<I, B> = &'a String);
79impl_partial_eq!(<'a, I, B> String = &'a Check<I, B>);
80impl_partial_eq!(<'a, I, B> &'a Check<I, B> = String);
81
82impl_partial_eq!(<I> str = Ck<I>);
83impl_partial_eq!(<I> Ck<I> = str);
84impl_partial_eq!(<'a, I> &'a str = Ck<I>);
85impl_partial_eq!(<'a, I> Ck<I> = &'a str);
86impl_partial_eq!(<'a, I> str = &'a Ck<I>);
87impl_partial_eq!(<'a, I> &'a Ck<I> = str);
88
89impl_partial_eq!(<I> String = Ck<I>);
90impl_partial_eq!(<I> Ck<I> = String);
91impl_partial_eq!(<'a, I> &'a String = Ck<I>);
92impl_partial_eq!(<'a, I> Ck<I> = &'a String);
93impl_partial_eq!(<'a, I> String = &'a Ck<I>);
94impl_partial_eq!(<'a, I> &'a Ck<I> = String);