Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-core/src/series/arithmetic/bitops.rs
6940 views
1
use std::borrow::Cow;
2
3
use polars_error::PolarsResult;
4
5
use super::{BooleanChunked, ChunkedArray, DataType, IntoSeries, Series, polars_bail};
6
7
macro_rules! impl_bitop {
8
($(($trait:ident, $f:ident))+) => {
9
$(
10
impl std::ops::$trait for &Series {
11
type Output = PolarsResult<Series>;
12
#[inline(never)]
13
fn $f(self, rhs: Self) -> Self::Output {
14
use DataType as DT;
15
match self.dtype() {
16
DT::Boolean => {
17
let lhs: &BooleanChunked = self.as_ref().as_ref().as_ref();
18
let rhs = lhs.unpack_series_matching_type(rhs)?;
19
Ok(lhs.$f(rhs).into_series())
20
},
21
dt if dt.is_integer() => {
22
let rhs = if rhs.len() == 1 {
23
Cow::Owned(rhs.cast(self.dtype())?)
24
} else {
25
Cow::Borrowed(rhs)
26
};
27
28
with_match_physical_integer_polars_type!(dt, |$T| {
29
let lhs: &ChunkedArray<$T> = self.as_ref().as_ref().as_ref();
30
let rhs = lhs.unpack_series_matching_type(&rhs)?;
31
Ok(lhs.$f(&rhs).into_series())
32
})
33
},
34
_ => polars_bail!(opq = $f, self.dtype()),
35
}
36
}
37
}
38
impl std::ops::$trait for Series {
39
type Output = PolarsResult<Series>;
40
#[inline(always)]
41
fn $f(self, rhs: Self) -> Self::Output {
42
<&Series as std::ops::$trait>::$f(&self, &rhs)
43
}
44
}
45
impl std::ops::$trait<&Series> for Series {
46
type Output = PolarsResult<Series>;
47
#[inline(always)]
48
fn $f(self, rhs: &Series) -> Self::Output {
49
<&Series as std::ops::$trait>::$f(&self, rhs)
50
}
51
}
52
impl std::ops::$trait<Series> for &Series {
53
type Output = PolarsResult<Series>;
54
#[inline(always)]
55
fn $f(self, rhs: Series) -> Self::Output {
56
<&Series as std::ops::$trait>::$f(self, &rhs)
57
}
58
}
59
)+
60
};
61
}
62
63
impl_bitop! {
64
(BitAnd, bitand)
65
(BitOr, bitor)
66
(BitXor, bitxor)
67
}
68
69