cp_library_rs/utils/
grid.rs1use num::One;
4use num_traits::{WrappingAdd, WrappingSub};
5
6pub trait Grid<T>
8where
9 Self: Sized,
10{
11 fn get_adj_4(&self, rrange: (T, T), crange: (T, T)) -> Vec<Self>;
24 fn get_adj_8(&self, rrange: (T, T), crange: (T, T)) -> Vec<Self>;
37 fn right(&self) -> (T, T);
39 fn upright(&self) -> (T, T);
41 fn up(&self) -> (T, T);
43 fn upleft(&self) -> (T, T);
45 fn left(&self) -> (T, T);
47 fn downleft(&self) -> (T, T);
49 fn down(&self) -> (T, T);
51 fn downright(&self) -> (T, T);
53}
54
55impl<T> Grid<T> for (T, T)
56where
57 T: Clone + PartialOrd + WrappingAdd + WrappingSub + One,
58{
59 fn right(&self) -> (T, T) {
60 let (r, c) = self.clone();
61 (r, c.wrapping_add(&T::one()))
62 }
63 fn upright(&self) -> (T, T) {
64 let (r, c) = self.clone();
65 (r.wrapping_sub(&T::one()), c.wrapping_add(&T::one()))
66 }
67 fn up(&self) -> (T, T) {
68 let (r, c) = self.clone();
69 (r.wrapping_sub(&T::one()), c)
70 }
71 fn upleft(&self) -> (T, T) {
72 let (r, c) = self.clone();
73 (r.wrapping_sub(&T::one()), c.wrapping_sub(&T::one()))
74 }
75 fn left(&self) -> (T, T) {
76 let (r, c) = self.clone();
77 (r, c.wrapping_sub(&T::one()))
78 }
79 fn downleft(&self) -> (T, T) {
80 let (r, c) = self.clone();
81 (r.wrapping_add(&T::one()), c.wrapping_sub(&T::one()))
82 }
83 fn down(&self) -> (T, T) {
84 let (r, c) = self.clone();
85 (r.wrapping_add(&T::one()), c)
86 }
87 fn downright(&self) -> (T, T) {
88 let (r, c) = self.clone();
89 (r.wrapping_add(&T::one()), c.wrapping_add(&T::one()))
90 }
91 fn get_adj_4(&self, rrange: (T, T), crange: (T, T)) -> Vec<Self> {
92 [self.right(), self.up(), self.left(), self.down()]
93 .into_iter()
94 .filter(|(r, c)| (&rrange.0 <= r && r < &rrange.1) && (&crange.0 <= c && c < &crange.1))
95 .collect()
96 }
97 fn get_adj_8(&self, rrange: (T, T), crange: (T, T)) -> Vec<Self> {
98 [
99 self.right(),
100 self.upright(),
101 self.up(),
102 self.upleft(),
103 self.left(),
104 self.downleft(),
105 self.down(),
106 self.downright(),
107 ]
108 .into_iter()
109 .filter(|(r, c)| (&rrange.0 <= r && r < &rrange.1) && (&crange.0 <= c && c < &crange.1))
110 .collect()
111 }
112}