trs_data_value/
operators.rs

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}