simd_json/value/borrowed/
cmp.rs

1use super::Value;
2use crate::OwnedValue;
3use crate::prelude::*;
4
5#[allow(clippy::cast_sign_loss, clippy::default_trait_access)]
6impl PartialEq for Value<'_> {
7    #[cfg_attr(not(feature = "no-inline"), inline)]
8    fn eq(&self, other: &Self) -> bool {
9        match (self, other) {
10            (Self::Static(s1), Self::Static(s2)) => s1 == s2,
11            (Self::String(v1), Self::String(v2)) => v1.eq(v2),
12            (Self::Array(v1), Self::Array(v2)) => v1.eq(v2),
13            (Self::Object(v1), Self::Object(v2)) => v1.eq(v2),
14            _ => false,
15        }
16    }
17}
18
19impl<'value, T> PartialEq<&T> for Value<'value>
20where
21    Value<'value>: PartialEq<T>,
22{
23    #[cfg_attr(not(feature = "no-inline"), inline)]
24    fn eq(&self, other: &&T) -> bool {
25        self == *other
26    }
27}
28
29impl PartialEq<OwnedValue> for Value<'_> {
30    #[cfg_attr(not(feature = "no-inline"), inline)]
31    fn eq(&self, other: &OwnedValue) -> bool {
32        // We only need to implement this once
33        other.eq(self)
34    }
35}
36
37impl PartialEq<()> for Value<'_> {
38    #[cfg_attr(not(feature = "no-inline"), inline)]
39    fn eq(&self, _other: &()) -> bool {
40        self.is_null()
41    }
42}
43
44impl PartialEq<bool> for Value<'_> {
45    #[cfg_attr(not(feature = "no-inline"), inline)]
46    fn eq(&self, other: &bool) -> bool {
47        self.as_bool().is_some_and(|t| t.eq(other))
48    }
49}
50
51impl PartialEq<str> for Value<'_> {
52    #[cfg_attr(not(feature = "no-inline"), inline)]
53    fn eq(&self, other: &str) -> bool {
54        self.as_str().is_some_and(|t| t.eq(other))
55    }
56}
57
58impl PartialEq<&str> for Value<'_> {
59    #[cfg_attr(not(feature = "no-inline"), inline)]
60    fn eq(&self, other: &&str) -> bool {
61        self == *other
62    }
63}
64
65impl PartialEq<String> for Value<'_> {
66    #[cfg_attr(not(feature = "no-inline"), inline)]
67    fn eq(&self, other: &String) -> bool {
68        self.as_str().is_some_and(|t| t.eq(other))
69    }
70}
71
72impl PartialEq<i8> for Value<'_> {
73    #[cfg_attr(not(feature = "no-inline"), inline)]
74    fn eq(&self, other: &i8) -> bool {
75        self.as_i8().is_some_and(|t| t.eq(other))
76    }
77}
78
79impl PartialEq<i16> for Value<'_> {
80    #[cfg_attr(not(feature = "no-inline"), inline)]
81    fn eq(&self, other: &i16) -> bool {
82        self.as_i16().is_some_and(|t| t.eq(other))
83    }
84}
85
86impl PartialEq<i32> for Value<'_> {
87    #[cfg_attr(not(feature = "no-inline"), inline)]
88    fn eq(&self, other: &i32) -> bool {
89        self.as_i32().is_some_and(|t| t.eq(other))
90    }
91}
92
93impl PartialEq<i64> for Value<'_> {
94    #[cfg_attr(not(feature = "no-inline"), inline)]
95    fn eq(&self, other: &i64) -> bool {
96        self.as_i64().is_some_and(|t| t.eq(other))
97    }
98}
99
100impl PartialEq<i128> for Value<'_> {
101    #[cfg_attr(not(feature = "no-inline"), inline)]
102    fn eq(&self, other: &i128) -> bool {
103        self.as_i128().is_some_and(|t| t.eq(other))
104    }
105}
106
107impl PartialEq<u8> for Value<'_> {
108    #[cfg_attr(not(feature = "no-inline"), inline)]
109    fn eq(&self, other: &u8) -> bool {
110        self.as_u8().is_some_and(|t| t.eq(other))
111    }
112}
113
114impl PartialEq<u16> for Value<'_> {
115    #[cfg_attr(not(feature = "no-inline"), inline)]
116    fn eq(&self, other: &u16) -> bool {
117        self.as_u16().is_some_and(|t| t.eq(other))
118    }
119}
120
121impl PartialEq<u32> for Value<'_> {
122    #[cfg_attr(not(feature = "no-inline"), inline)]
123    fn eq(&self, other: &u32) -> bool {
124        self.as_u32().is_some_and(|t| t.eq(other))
125    }
126}
127
128impl PartialEq<u64> for Value<'_> {
129    #[cfg_attr(not(feature = "no-inline"), inline)]
130    fn eq(&self, other: &u64) -> bool {
131        self.as_u64().is_some_and(|t| t.eq(other))
132    }
133}
134
135impl PartialEq<usize> for Value<'_> {
136    #[cfg_attr(not(feature = "no-inline"), inline)]
137    fn eq(&self, other: &usize) -> bool {
138        self.as_usize().is_some_and(|t| t.eq(other))
139    }
140}
141
142impl PartialEq<u128> for Value<'_> {
143    #[cfg_attr(not(feature = "no-inline"), inline)]
144    fn eq(&self, other: &u128) -> bool {
145        self.as_u128().is_some_and(|t| t.eq(other))
146    }
147}
148
149impl PartialEq<f32> for Value<'_> {
150    #[cfg_attr(not(feature = "no-inline"), inline)]
151    fn eq(&self, other: &f32) -> bool {
152        self.as_f32().is_some_and(|t| t.eq(other))
153    }
154}
155
156impl PartialEq<f64> for Value<'_> {
157    #[cfg_attr(not(feature = "no-inline"), inline)]
158    fn eq(&self, other: &f64) -> bool {
159        self.as_f64().is_some_and(|t| t.eq(other))
160    }
161}
162
163impl<'v, T> PartialEq<&[T]> for Value<'v>
164where
165    Value<'v>: PartialEq<T>,
166{
167    #[cfg_attr(not(feature = "no-inline"), inline)]
168    fn eq(&self, other: &&[T]) -> bool {
169        self.as_array().is_some_and(|t| t.eq(other))
170    }
171}
172
173impl<'v, K, T, S> PartialEq<std::collections::HashMap<K, T, S>> for Value<'v>
174where
175    K: AsRef<str> + std::hash::Hash + Eq,
176    Value<'v>: PartialEq<T>,
177    S: std::hash::BuildHasher,
178{
179    #[cfg_attr(not(feature = "no-inline"), inline)]
180    fn eq(&self, other: &std::collections::HashMap<K, T, S>) -> bool {
181        self.as_object().is_some_and(|object| {
182            object.len() == other.len()
183                && other
184                    .iter()
185                    .all(|(key, value)| object.get(key.as_ref()).is_some_and(|v| *v == *value))
186        })
187    }
188}