1 | use crate::{ |
2 | grid::records::{ExactRecords, Records, Resizable}, |
3 | settings::TableOption, |
4 | }; |
5 | |
6 | /// Reverse data on the table. |
7 | #[derive (Debug, Clone, Copy, Default, Hash, PartialEq, Eq, PartialOrd, Ord)] |
8 | pub struct Reverse { |
9 | columns: bool, |
10 | } |
11 | |
12 | impl Reverse { |
13 | /// Reverse columns. |
14 | pub const fn columns() -> Self { |
15 | Self { columns: true } |
16 | } |
17 | |
18 | /// Reverse rows. |
19 | pub const fn rows() -> Self { |
20 | Self { columns: false } |
21 | } |
22 | } |
23 | |
24 | impl<R, D, C> TableOption<R, C, D> for Reverse |
25 | where |
26 | R: Resizable + Records + ExactRecords, |
27 | { |
28 | fn change(self, records: &mut R, _: &mut C, _: &mut D) { |
29 | match self.columns { |
30 | true => reverse_columns(data:records), |
31 | false => reverse_rows(data:records), |
32 | } |
33 | } |
34 | } |
35 | |
36 | fn reverse_rows<R>(data: &mut R) |
37 | where |
38 | R: Resizable + ExactRecords, |
39 | { |
40 | let count_rows: usize = data.count_rows(); |
41 | if count_rows < 2 { |
42 | return; |
43 | } |
44 | |
45 | for row: usize in 0..count_rows / 2 { |
46 | data.swap_row(lhs:row, rhs:count_rows - row - 1); |
47 | } |
48 | } |
49 | |
50 | fn reverse_columns<R>(data: &mut R) |
51 | where |
52 | R: Resizable + Records, |
53 | { |
54 | let count_columns: usize = data.count_columns(); |
55 | if count_columns < 2 { |
56 | return; |
57 | } |
58 | |
59 | for col: usize in 0..count_columns / 2 { |
60 | data.swap_column(lhs:col, rhs:count_columns - col - 1); |
61 | } |
62 | } |
63 | |
64 | #[cfg (test)] |
65 | #[cfg (feature = "std" )] |
66 | mod tests { |
67 | use crate::grid::records::vec_records::VecRecords; |
68 | |
69 | use super::{reverse_columns, reverse_rows}; |
70 | |
71 | #[test ] |
72 | fn test_reverse_rows() { |
73 | assert_eq!( |
74 | rev_rows(vec![vec![0, 1, 2], vec![3, 4, 5], vec![6, 7, 8]]), |
75 | vec![vec![6, 7, 8], vec![3, 4, 5], vec![0, 1, 2]] |
76 | ) |
77 | } |
78 | |
79 | #[test ] |
80 | fn test_reverse_columns() { |
81 | assert_eq!( |
82 | rev_cols(vec![vec![0, 1, 2], vec![3, 4, 5], vec![6, 7, 8]]), |
83 | vec![vec![2, 1, 0], vec![5, 4, 3], vec![8, 7, 6]] |
84 | ) |
85 | } |
86 | |
87 | fn rev_rows(mut data: Vec<Vec<usize>>) -> Vec<Vec<usize>> { |
88 | reverse_rows(&mut data); |
89 | data |
90 | } |
91 | |
92 | fn rev_cols(data: Vec<Vec<usize>>) -> Vec<Vec<usize>> { |
93 | let mut records = VecRecords::new(data); |
94 | reverse_columns(&mut records); |
95 | |
96 | records.into() |
97 | } |
98 | } |
99 | |