1use super::DataValue;
2
3impl PartialOrd for DataValue {
4 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
5 Some(self.cmp(other))
6 }
7}
8impl Ord for DataValue {
9 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
10 use DataValue::*;
11 match (self, other) {
12 (Bool(l0), Bool(r0)) => l0.cmp(r0),
13 (U32(l0), U32(r0)) => l0.cmp(r0),
14 (I32(l0), I32(r0)) => l0.cmp(r0),
15 (U8(l0), U8(r0)) => l0.cmp(r0),
16 (U64(l0), U64(r0)) => l0.cmp(r0),
17 (I64(l0), I64(r0)) => l0.cmp(r0),
18 (U128(l0), U128(r0)) => l0.cmp(r0),
19 (I128(l0), I128(r0)) => l0.cmp(r0),
20 (F32(l0), F32(r0)) => l0.partial_cmp(r0).expect("BUG: cannot compare f32"),
21 (F64(l0), F64(r0)) => l0.partial_cmp(r0).expect("BUG: cannot compare f64"),
22 (String(l0), String(r0)) => l0.cmp(r0),
23 (Bytes(l0), Bytes(r0)) => l0.cmp(r0),
24 (Vec(l0), Vec(r0)) => l0.cmp(r0),
25 (Map(l0), Map(r0)) => l0.keys().cmp(r0.keys()),
26 _ => std::cmp::Ordering::Less,
27 }
28 }
29}
30impl std::cmp::PartialEq for DataValue {
31 fn eq(&self, other: &Self) -> bool {
32 match (self, other) {
33 (Self::Bool(l0), Self::Bool(r0)) => l0 == r0,
34 (Self::U32(l0), Self::U32(r0)) => l0 == r0,
35 (Self::I32(l0), Self::I32(r0)) => l0 == r0,
36 (Self::U8(l0), Self::U8(r0)) => l0 == r0,
37 (Self::U64(l0), Self::U64(r0)) => l0 == r0,
38 (Self::I64(l0), Self::I64(r0)) => l0 == r0,
39 (Self::U128(l0), Self::U128(r0)) => l0 == r0,
40 (Self::I128(l0), Self::I128(r0)) => l0 == r0,
41 (Self::F32(l0), Self::F32(r0)) => (l0 - r0).abs() < f32::EPSILON,
42 (Self::F64(l0), Self::F64(r0)) => (l0 - r0).abs() < f64::EPSILON,
43 (Self::String(l0), Self::String(r0)) => l0 == r0,
44 (Self::Bytes(l0), Self::Bytes(r0)) => l0 == r0,
45 (Self::Vec(l0), Self::Vec(r0)) => l0.eq(r0),
46 (Self::Map(l0), Self::Map(r0)) => l0.eq(r0),
47 (Self::Null, Self::Null) => true,
48 _ => false,
49 }
50 }
51}
52
53impl std::cmp::Eq for DataValue {}
54
55#[cfg(test)]
56mod test {
57 use super::*;
58 use rstest::*;
59
60 #[rstest]
61 #[case(DataValue::U8(1), DataValue::U8(1), true)]
62 #[case(DataValue::U8(1), DataValue::U8(2), false)]
63 #[case(DataValue::U8(1), DataValue::U32(1), false)]
64 #[case(DataValue::U8(1), DataValue::I32(1), false)]
65 #[case(DataValue::U8(1), DataValue::U64(1), false)]
66 #[case(DataValue::U8(1), DataValue::I64(1), false)]
67 #[case(DataValue::U8(1), DataValue::U128(1), false)]
68 #[case(DataValue::U8(1), DataValue::I128(1), false)]
69 #[case(DataValue::U8(1), DataValue::F32(1.0), false)]
70 #[case(DataValue::U8(1), DataValue::F64(1.0), false)]
71 #[case(DataValue::U8(1), DataValue::String("1".into()), false)]
72 #[case(DataValue::U8(1), DataValue::Bytes(b"1".to_vec()), false)]
73 #[case(DataValue::U8(1), DataValue::Vec(vec![1.into()]), false)]
74 #[case(DataValue::U8(1), DataValue::Map(crate::stdhashmap!("a" => 1)), false)]
75 #[case(DataValue::U8(1), DataValue::Null, false)]
76 fn test_eq(#[case] left: DataValue, #[case] right: DataValue, #[case] expected: bool) {
77 assert_eq!(left == right, expected);
78 assert_eq!(left.cmp(&right), expected.cmp(&true));
79 }
80
81 #[rstest]
82 #[case(DataValue::Vec(
83 vec![
84 DataValue::U8(1), DataValue::U32(2), DataValue::U64(3), DataValue::U128(4), DataValue::I128(5), DataValue::I32(1), DataValue::I64(1),
85 DataValue::I128(5), DataValue::F32(6.0), DataValue::F64(7.0), DataValue::String("8".into()),
86 DataValue::Bytes(b"9".to_vec()), DataValue::Vec(vec![DataValue::U8(10)]),
87 DataValue::Map(crate::stdhashmap!("a" => 11))
88 ]
89 ), DataValue::Vec(vec![
90 DataValue::U8(1), DataValue::U32(2), DataValue::U64(3), DataValue::U128(4), DataValue::I128(5), DataValue::I32(1), DataValue::I64(1),
91 DataValue::I128(5), DataValue::F32(6.0), DataValue::F64(7.0), DataValue::String("8".into()),
92 DataValue::Bytes(b"9".to_vec()), DataValue::Vec(vec![DataValue::U8(10)]),
93 DataValue::Map(crate::stdhashmap!("a" => 11))]), std::cmp::Ordering::Equal)
94 ]
95 #[case(DataValue::Vec(
96 vec![
97 DataValue::U8(1), DataValue::U32(2), DataValue::U64(3), DataValue::U128(4), DataValue::I128(5), DataValue::I32(1), DataValue::I64(1),
98 DataValue::I128(5), DataValue::F32(6.0), DataValue::F64(7.0), DataValue::String("8".into()),
99 DataValue::Bytes(b"9".to_vec()), DataValue::Vec(vec![DataValue::U8(10)]),
100 DataValue::Map(crate::stdhashmap!("a" => 11))
101 ]
102 ), DataValue::Vec(
103 vec![DataValue::U8(1), DataValue::U8(2), DataValue::U8(3)]
104 ), std::cmp::Ordering::Less)
105 ]
106 fn test_cmp(
107 #[case] left: DataValue,
108 #[case] right: DataValue,
109 #[case] expected: std::cmp::Ordering,
110 ) {
111 assert_eq!(left.cmp(&right), expected);
112 }
113}