1use 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)]
8pub struct Reverse {
9 columns: bool,
10}
11
12impl 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
24impl<R, D, C> TableOption<R, C, D> for Reverse
25where
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
36fn reverse_rows<R>(data: &mut R)
37where
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
50fn reverse_columns<R>(data: &mut R)
51where
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")]
66mod 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