1use crate::ops::PartialEq;
2use rbs::Value;
3use std::borrow::Cow;
4use std::cmp::PartialEq as PE;
5use std::ops::Deref;
6
7#[inline]
8fn eq_i64(value: i64, rhs: i64) -> bool {
9 value == rhs
10}
11
12#[inline]
13fn eq_f64(value: f64, rhs: f64) -> bool {
14 value == rhs
15}
16
17#[inline]
18fn eq_bool(value: bool, rhs: bool) -> bool {
19 value == rhs
20}
21
22#[inline]
23fn eq_str(value: &str, rhs: &str) -> bool {
24 value == rhs
25}
26
27#[inline]
28fn into_i64(value: &Value) -> i64 {
29 value.as_i64().unwrap_or_default()
30}
31
32#[inline]
33fn into_f64(value: &Value) -> f64 {
34 value.as_f64().unwrap_or_default()
35}
36
37#[inline]
38fn into_bool(value: &Value) -> bool {
39 value.as_bool().unwrap_or_default()
40}
41
42impl PartialEq<Value> for &Value {
43 fn op_eq(&self, other: &Value) -> bool {
44 self.eq(&other)
45 }
46}
47
48impl PartialEq<&Value> for &Value {
49 fn op_eq(&self, other: &&Value) -> bool {
50 self.eq(&*other)
51 }
52}
53
54impl PartialEq<&&Value> for &Value {
55 fn op_eq(&self, other: &&&Value) -> bool {
56 self.eq(&**other)
57 }
58}
59
60impl PartialEq<&&Value> for &&Value {
61 fn op_eq(&self, other: &&&Value) -> bool {
62 self.eq(other)
63 }
64}
65
66impl PartialEq<Value> for &&Value {
67 fn op_eq(&self, other: &Value) -> bool {
68 (*self).eq(&other)
69 }
70}
71
72impl PartialEq<&Value> for Value {
73 fn op_eq(&self, other: &&Value) -> bool {
74 self.eq(&**other)
75 }
76}
77
78impl PartialEq<&&Value> for Value {
79 fn op_eq(&self, other: &&&Value) -> bool {
80 self.eq(&***other)
81 }
82}
83
84impl PartialEq<Value> for Value {
85 fn op_eq(&self, other: &Value) -> bool {
86 self.eq(other)
87 }
88}
89
90impl PartialEq<str> for Value {
91 fn op_eq(&self, other: &str) -> bool {
92 eq_str(self.as_str().unwrap_or_default(), other)
93 }
94}
95
96impl<'a> PartialEq<&'a str> for Value {
97 fn op_eq(&self, other: &&str) -> bool {
98 eq_str(self.as_str().unwrap_or_default(), *other)
99 }
100}
101
102impl PartialEq<Value> for str {
103 fn op_eq(&self, other: &Value) -> bool {
104 eq_str(other.as_str().unwrap_or_default(), self)
105 }
106}
107
108impl<'a> PartialEq<Value> for &'a str {
109 fn op_eq(&self, other: &Value) -> bool {
110 eq_str(other.as_str().unwrap_or_default(), *self)
111 }
112}
113
114impl PartialEq<&str> for str {
115 fn op_eq(&self, other: &&str) -> bool {
116 self.eq(*other)
117 }
118}
119
120impl PartialEq<String> for Value {
121 fn op_eq(&self, other: &String) -> bool {
122 eq_str(self.as_str().unwrap_or_default(), other.as_str())
123 }
124}
125
126impl PartialEq<String> for &Value {
127 fn op_eq(&self, other: &String) -> bool {
128 eq_str(self.as_str().unwrap_or_default(), other.as_str())
129 }
130}
131
132impl PartialEq<&str> for &Value {
133 fn op_eq(&self, other: &&str) -> bool {
134 eq_str(self.as_str().unwrap_or_default(), *other)
135 }
136}
137
138impl PartialEq<Value> for String {
139 fn op_eq(&self, other: &Value) -> bool {
140 eq_str(other.as_str().unwrap_or_default(), self.as_str())
141 }
142}
143
144impl PartialEq<Cow<'_, Value>> for Value {
145 fn op_eq(&self, other: &Cow<'_, Value>) -> bool {
146 self.eq(other.deref())
147 }
148}
149
150macro_rules! impl_numeric_eq {
151 ($($eq:ident,$into:ident [$($ty:ty)*])*) => {
152 $($(
153 impl PartialEq<$ty> for Value {
154 fn op_eq(&self, other: &$ty) -> bool {
155 $eq($into(self), *other as _)
156 }
157 }
158
159 impl PartialEq<&$ty> for Value {
160 fn op_eq(&self, other: &&$ty) -> bool {
161 $eq($into(self), **other as _)
162 }
163 }
164
165 impl<'a> PartialEq<$ty> for &'a Value {
166 fn op_eq(&self, other: &$ty) -> bool {
167 $eq($into(*self), *other as _)
168 }
169 }
170
171 impl<'a> PartialEq<&$ty> for &'a Value {
172 fn op_eq(&self, other: &&$ty) -> bool {
173 $eq($into(*self), **other as _)
174 }
175 }
176
177 impl PartialEq<Value> for $ty {
178 fn op_eq(&self, other: &Value) -> bool {
179 $eq($into(other), *self as _)
180 }
181 }
182
183 impl PartialEq<&Value> for $ty {
184 fn op_eq(&self, other: &&Value) -> bool {
185 $eq($into(*other), *self as _)
186 }
187 }
188
189 impl PartialEq<Value> for &$ty {
190 fn op_eq(&self, other: &Value) -> bool {
191 $eq($into(other), **self as _)
192 }
193 }
194
195 impl PartialEq<&Value> for &$ty {
196 fn op_eq(&self, other: &&Value) -> bool {
197 $eq($into(*other), **self as _)
198 }
199 }
200 impl PartialEq<&&Value> for $ty {
202 fn op_eq(&self, other: &&&Value) -> bool {
203 $eq($into(**other), *self as _)
204 }
205 }
206 )*)*
207 }
208}
209
210impl_numeric_eq! {
211 eq_i64,into_i64[u8 u16 u32 u64]
212 eq_i64,into_i64[i8 i16 i32 i64 isize usize]
213 eq_f64,into_f64[f32 f64]
214 eq_bool,into_bool[bool]
215}
216
217macro_rules! self_eq {
218 ([$($ty:ty)*]) => {
219 $(
220impl PartialEq<$ty> for $ty{
221 fn op_eq(&self, rhs: &$ty) -> bool {
222 self.eq(rhs)
223 }
224 }
225impl PartialEq<&$ty> for $ty{
226 fn op_eq(&self, rhs: &&$ty) -> bool {
227 self.eq(*rhs)
228 }
229 }
230impl PartialEq<$ty> for &$ty{
231 fn op_eq(&self, rhs: &$ty) -> bool {
232 self.eq(&rhs)
233 }
234 }
235impl PartialEq<&$ty> for &$ty{
236 fn op_eq(&self, rhs: &&$ty) -> bool {
237 self.eq(rhs)
238 }
239 }
240 )*
241 };
242}
243
244self_eq!([u8 u16 u32 u64]);
245self_eq!([i8 i16 i32 i64 isize usize]);
246self_eq!([f32 f64]);
247self_eq!([String & str]);
248
249macro_rules! impl_str_eq {
250 ($($eq:ident [$($ty:ty)*])*) => {
251 $($(
252 impl PartialEq<$ty> for &str {
253 fn op_eq(&self, other: &$ty) -> bool {
254 $eq(self, *other as _)
255 }
256 }
257
258 impl PartialEq<&str> for $ty {
259 fn op_eq(&self, other: &&str) -> bool {
260 $eq(other, *self as _)
261 }
262 }
263
264 impl PartialEq<&&str> for $ty {
265 fn op_eq(&self, other: &&&str) -> bool {
266 $eq(*other, *self as _)
267 }
268 }
269
270 impl PartialEq<&&&str> for $ty {
271 fn op_eq(&self, other: &&&&str) -> bool {
272 $eq(**other, *self as _)
273 }
274 }
275
276 impl<'a> PartialEq<$ty> for &'a &str {
277 fn op_eq(&self, other: &$ty) -> bool {
278 $eq(*self, *other as _)
279 }
280 }
281 )*)*
282 }
283}
284
285fn eq_str_i64(value: &str, other: i64) -> bool {
286 value.eq(&other.to_string())
287}
288
289fn eq_str_f64(value: &str, other: f64) -> bool {
290 value.eq(&other.to_string())
291}
292
293fn eq_str_bool(value: &str, other: bool) -> bool {
294 match value {
295 "true" => {
296 if other {
297 true
298 } else {
299 false
300 }
301 }
302 "false" => {
303 if !other {
304 true
305 } else {
306 false
307 }
308 }
309 _ => false,
310 }
311}
312impl_str_eq! {
313 eq_str_i64[u8 u16 u32 u64]
314 eq_str_i64[i8 i16 i32 i64 isize usize]
315 eq_str_f64[f32 f64]
316 eq_str_bool[bool]
317}
318
319macro_rules! eq_diff {
320 ($eq:ident[$(($ty1:ty,$ty2:ty),)*]) => {
321 $(
322 impl PartialEq<$ty1> for $ty2{
323 fn op_eq(&self, rhs: &$ty1) -> bool {
324 rhs.eq(&(*self as $ty1))
325 }
326 }
327 impl PartialEq<&$ty1> for $ty2{
328 fn op_eq(&self, rhs: &&$ty1) -> bool {
329 (*rhs).eq(&(*self as $ty1))
330 }
331 }
332 impl PartialEq<$ty1> for &$ty2{
333 fn op_eq(&self, rhs: &$ty1) -> bool {
334 rhs.eq(&(**self as $ty1))
335 }
336 }
337 impl PartialEq<&$ty1> for &$ty2{
338 fn op_eq(&self, rhs: &&$ty1) -> bool {
339 (*rhs).eq(&(**self as $ty1))
340 }
341 }
342 )*
343 };
344}
345
346eq_diff!(eq_i64[(i64,i8),(i64,i16),(i64,i32),]);
347eq_diff!(eq_i64[(i64,u8),(i64,u16),(i64,u32),(i64,u64),(i64,usize),]);
348eq_diff!(eq_f64[(i64,f32),(i64,f64),]);
349
350eq_diff!(eq_i64[(u64,i8),(u64,i16),(u64,i32),(u64,i64),]);
351eq_diff!(eq_u64[(u64,u8),(u64,u16),(u64,u32),(u64,usize),]);
352eq_diff!(eq_f64[(u64,f32),(u64,f64),]);
353
354eq_diff!(eq_f64[(f64,u8),(f64,u16),(f64,u32),(f64,u64),(f64,usize),]);
355eq_diff!(eq_f64[(f64,i8),(f64,i16),(f64,i32),(f64,i64),]);
356eq_diff!(eq_f64[(f64,f32),]);
357
358#[cfg(test)]
359mod test {
360 use crate::ops::{Add};
361 use rbs::{value, Value};
362
363 #[test]
364 fn test_eq() {
365 let i: i64 = 1;
366 let v = value!(1);
367 let r = Value::from(v.op_add(&i));
368 if r == Value::from(2) {
369 assert!(true);
370 } else {
371 assert!(false);
372 }
373 }
374}