polars_arrow/scalar/
equal.rs1use std::sync::Arc;
2
3use super::*;
4use crate::{match_integer_type, with_match_primitive_type_full};
5
6impl PartialEq for dyn Scalar + '_ {
7 fn eq(&self, that: &dyn Scalar) -> bool {
8 equal(self, that)
9 }
10}
11
12impl PartialEq<dyn Scalar> for Arc<dyn Scalar + '_> {
13 fn eq(&self, that: &dyn Scalar) -> bool {
14 equal(&**self, that)
15 }
16}
17
18impl PartialEq<dyn Scalar> for Box<dyn Scalar + '_> {
19 fn eq(&self, that: &dyn Scalar) -> bool {
20 equal(&**self, that)
21 }
22}
23
24macro_rules! dyn_eq {
25 ($ty:ty, $lhs:expr, $rhs:expr) => {{
26 let lhs = $lhs.as_any().downcast_ref::<$ty>().unwrap();
27 let rhs = $rhs.as_any().downcast_ref::<$ty>().unwrap();
28 lhs == rhs
29 }};
30}
31
32fn equal(lhs: &dyn Scalar, rhs: &dyn Scalar) -> bool {
33 if lhs.dtype() != rhs.dtype() {
34 return false;
35 }
36
37 use PhysicalType::*;
38 match lhs.dtype().to_physical_type() {
39 Null => dyn_eq!(NullScalar, lhs, rhs),
40 Boolean => dyn_eq!(BooleanScalar, lhs, rhs),
41 Primitive(primitive) => with_match_primitive_type_full!(primitive, |$T| {
42 dyn_eq!(PrimitiveScalar<$T>, lhs, rhs)
43 }),
44 LargeUtf8 => dyn_eq!(Utf8Scalar<i64>, lhs, rhs),
45 LargeBinary => dyn_eq!(BinaryScalar<i64>, lhs, rhs),
46 LargeList => dyn_eq!(ListScalar<i64>, lhs, rhs),
47 Dictionary(key_type) => match_integer_type!(key_type, |$T| {
48 dyn_eq!(DictionaryScalar<$T>, lhs, rhs)
49 }),
50 Struct => dyn_eq!(StructScalar, lhs, rhs),
51 FixedSizeBinary => dyn_eq!(FixedSizeBinaryScalar, lhs, rhs),
52 FixedSizeList => dyn_eq!(FixedSizeListScalar, lhs, rhs),
53 Union => dyn_eq!(UnionScalar, lhs, rhs),
54 Map => dyn_eq!(MapScalar, lhs, rhs),
55 Utf8View => dyn_eq!(BinaryViewScalar<str>, lhs, rhs),
56 _ => unimplemented!(),
57 }
58}