trs_dataframe/dataframe/column_store/
ops.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
use std::ops::{AddAssign, DivAssign, MulAssign, SubAssign};

use super::ColumnFrame;

impl AddAssign for ColumnFrame {
    fn add_assign(&mut self, rhs: Self) {
        self.data_frame.zip_mut_with(&rhs.data_frame, |x, y| {
            let z = x.clone();
            *x = z + y.clone();
        });
    }
}

impl SubAssign for ColumnFrame {
    fn sub_assign(&mut self, rhs: Self) {
        self.data_frame.zip_mut_with(&rhs.data_frame, |x, y| {
            let z = x.clone();
            *x = z - y.clone();
        });
    }
}

impl MulAssign for ColumnFrame {
    fn mul_assign(&mut self, rhs: Self) {
        self.data_frame.zip_mut_with(&rhs.data_frame, |x, y| {
            let z = x.clone();
            *x = z * y.clone();
        });
    }
}

impl DivAssign for ColumnFrame {
    fn div_assign(&mut self, rhs: Self) {
        self.data_frame.zip_mut_with(&rhs.data_frame, |x, y| {
            let z = x.clone();
            *x = z / y.clone();
        });
    }
}

#[cfg(test)]
mod test {
    use crate::column_frame;

    use super::*;
    use rstest::*;
    #[rstest]
    #[case(
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![2, 4, 6])
    )]
    fn test_add_assign(
        #[case] mut a: ColumnFrame,
        #[case] b: ColumnFrame,
        #[case] expected: ColumnFrame,
    ) {
        a += b;
        assert_eq!(a, expected);
    }
    #[rstest]
    #[case(
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![0f32, 0f32, 0f32])
    )]
    fn test_sub_assign(
        #[case] mut a: ColumnFrame,
        #[case] b: ColumnFrame,
        #[case] expected: ColumnFrame,
    ) {
        a -= b;
        assert_eq!(a, expected);
    }

    #[rstest]
    #[case(
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![1f32, 4f32, 9f32])
    )]
    fn test_mul_assign(
        #[case] mut a: ColumnFrame,
        #[case] b: ColumnFrame,
        #[case] expected: ColumnFrame,
    ) {
        a *= b;
        assert_eq!(a, expected);
    }

    #[rstest]
    #[case(
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![1, 2, 3]),
        column_frame!("a" => vec![1f32, 1f32, 1f32])
    )]
    fn test_div_assign(
        #[case] mut a: ColumnFrame,
        #[case] b: ColumnFrame,
        #[case] expected: ColumnFrame,
    ) {
        a /= b;
        assert_eq!(a, expected);
    }
}