Path: blob/main/crates/polars-core/src/frame/column/arithmetic.rs
6940 views
use num_traits::{Num, NumCast};1use polars_error::PolarsResult;23use super::{Column, ScalarColumn, Series};45fn num_op_with_broadcast<T: Num + NumCast, F: Fn(&Series, T) -> Series>(6c: &'_ Column,7n: T,8op: F,9) -> Column {10match c {11Column::Series(s) => op(s, n).into(),12// @partition-opt13Column::Partitioned(s) => op(s.as_materialized_series(), n).into(),14Column::Scalar(s) => {15ScalarColumn::from_single_value_series(op(&s.as_single_value_series(), n), s.len())16.into()17},18}19}2021macro_rules! broadcastable_ops {22($(($trait:ident, $op:ident))+) => {23$(24impl std::ops::$trait for Column {25type Output = PolarsResult<Column>;2627#[inline]28fn $op(self, rhs: Self) -> Self::Output {29self.try_apply_broadcasting_binary_elementwise(&rhs, |l, r| l.$op(r))30}31}3233impl std::ops::$trait for &Column {34type Output = PolarsResult<Column>;3536#[inline]37fn $op(self, rhs: Self) -> Self::Output {38self.try_apply_broadcasting_binary_elementwise(rhs, |l, r| l.$op(r))39}40}41)+42}43}4445macro_rules! broadcastable_num_ops {46($(($trait:ident, $op:ident))+) => {47$(48impl<T> std::ops::$trait::<T> for Column49where50T: Num + NumCast,51{52type Output = Self;5354#[inline]55fn $op(self, rhs: T) -> Self::Output {56num_op_with_broadcast(&self, rhs, |l, r| l.$op(r))57}58}5960impl<T> std::ops::$trait::<T> for &Column61where62T: Num + NumCast,63{64type Output = Column;6566#[inline]67fn $op(self, rhs: T) -> Self::Output {68num_op_with_broadcast(self, rhs, |l, r| l.$op(r))69}70}71)+72};73}7475broadcastable_ops! {76(Add, add)77(Sub, sub)78(Mul, mul)79(Div, div)80(Rem, rem)81(BitAnd, bitand)82(BitOr, bitor)83(BitXor, bitxor)84}8586broadcastable_num_ops! {87(Add, add)88(Sub, sub)89(Mul, mul)90(Div, div)91(Rem, rem)92}939495