diff options
| author | a14m <[email protected]> | 2021-04-07 17:46:30 +0200 |
|---|---|---|
| committer | a14m <[email protected]> | 2021-04-07 17:46:30 +0200 |
| commit | b087dea8fde79d48f14684f7415c493b917f5c64 (patch) | |
| tree | 6099976d46fe14dff30deda2651e596b53f91ff0 | |
| parent | ffb998e6b6d45b50cc1eb46e8d0b76ca24b60b15 (diff) | |
Refactor PLane impl to be generic to allow nesting
Wrap the outer vector in a plane to allow safer navigation
| -rw-r--r-- | CLI/rust/src/game_of_life.rs | 4 | ||||
| -rw-r--r-- | CLI/rust/src/game_of_life/generators/input.rs | 32 | ||||
| -rw-r--r-- | CLI/rust/src/game_of_life/simulation/plane.rs | 10 | ||||
| -rw-r--r-- | CLI/rust/src/game_of_life/simulation/universe.rs | 60 |
4 files changed, 53 insertions, 53 deletions
diff --git a/CLI/rust/src/game_of_life.rs b/CLI/rust/src/game_of_life.rs index ffbe175..383d564 100644 --- a/CLI/rust/src/game_of_life.rs +++ b/CLI/rust/src/game_of_life.rs @@ -180,8 +180,8 @@ mod generate { fn universe_mock(opts: Opts) -> Universe { Universe { opts, - current: vec![Plane(vec![])], - future: vec![Plane(vec![])], + current: Plane(vec![Plane(vec![])]), + future: Plane(vec![Plane(vec![])]), } } diff --git a/CLI/rust/src/game_of_life/generators/input.rs b/CLI/rust/src/game_of_life/generators/input.rs index 8d0ae0d..3b709e0 100644 --- a/CLI/rust/src/game_of_life/generators/input.rs +++ b/CLI/rust/src/game_of_life/generators/input.rs @@ -30,8 +30,8 @@ mod new { fn universe_mock(opts: Opts) -> Universe { Universe { opts, - current: vec![Plane(vec![])], - future: vec![Plane(vec![])], + current: Plane(vec![Plane(vec![])]), + future: Plane(vec![Plane(vec![])]), } } @@ -114,12 +114,12 @@ mod generate_file_data { universe, Universe { opts, - future: vec![Plane(vec![false; 4]); 3], - current: vec![ + future: Plane(vec![Plane(vec![false; 4]); 3]), + current: Plane(vec![ Plane(vec![false, false, true, true]), Plane(vec![false, false, true, true]), Plane(vec![false, false, false, false]), - ], + ]), } ) } @@ -191,12 +191,12 @@ mod generate_url_data { universe, Universe { opts, - future: vec![Plane(vec![false; 4]); 3], - current: vec![ + future: Plane(vec![Plane(vec![false; 4]); 3]), + current: Plane(vec![ Plane(vec![false, false, true, true]), // <!do Plane(vec![false, true, true, true]), // <htm Plane(vec![false, true, true, true]), // <hea - ], + ]), } ) } @@ -222,11 +222,11 @@ fn populate(opts: Opts, raw_data: String) -> Universe { }) .collect(); - let mut current = vec![Plane(vec![false; width]); height]; + let mut current = Plane(vec![Plane(vec![false; width]); height]); for i in 0..height { for j in 0..width { - current[i][j as isize] = data + current[i as isize][j as isize] = data .get(i) .unwrap_or(&vec![]) .get(j) @@ -238,7 +238,7 @@ fn populate(opts: Opts, raw_data: String) -> Universe { Universe { opts, current, - future: vec![Plane(vec![false; width]); height], + future: Plane(vec![Plane(vec![false; width]); height]), } } @@ -268,14 +268,14 @@ mod populate { universe, Universe { opts, - future: vec![Plane(vec![false; 5]); 5], - current: vec![ + future: Plane(vec![Plane(vec![false; 5]); 5]), + current: Plane(vec![ Plane(vec![true, false, true, false, false]), Plane(vec![true, false, true, false, false]), Plane(vec![true, false, true, false, false]), Plane(vec![false, false, false, false, false]), Plane(vec![false, false, false, false, false]), - ] + ]) } ) } @@ -290,8 +290,8 @@ mod populate { universe, Universe { opts, - future: vec![Plane(vec![false; 2]); 2], - current: vec![Plane(vec![true, false]), Plane(vec![true, false])] + future: Plane(vec![Plane(vec![false; 2]); 2]), + current: Plane(vec![Plane(vec![true, false]), Plane(vec![true, false])]) } ) } diff --git a/CLI/rust/src/game_of_life/simulation/plane.rs b/CLI/rust/src/game_of_life/simulation/plane.rs index 76d91fb..21c34cf 100644 --- a/CLI/rust/src/game_of_life/simulation/plane.rs +++ b/CLI/rust/src/game_of_life/simulation/plane.rs @@ -6,11 +6,11 @@ use std::ops::{Index, IndexMut}; /// This is used internally in the implementation of the Universe to allow /// more readable and safer traversing of the universe blocks #[derive(Debug, Clone, PartialEq)] -pub(crate) struct Plane(pub Vec<bool>); +pub(crate) struct Plane<T>(pub Vec<T>); -impl Index<isize> for Plane { - type Output = bool; - fn index(&self, idx: isize) -> &bool { +impl<T> Index<isize> for Plane<T> { + type Output = T; + fn index(&self, idx: isize) -> &T { let len = self.0.len() as isize; &self.0[circular_index(idx, len)] } @@ -34,7 +34,7 @@ mod index { } } -impl IndexMut<isize> for Plane { +impl<T> IndexMut<isize> for Plane<T> { fn index_mut(&mut self, idx: isize) -> &mut Self::Output { let len = self.0.len() as isize; &mut self.0[circular_index(idx, len)] diff --git a/CLI/rust/src/game_of_life/simulation/universe.rs b/CLI/rust/src/game_of_life/simulation/universe.rs index 8c1965d..e91e1bd 100644 --- a/CLI/rust/src/game_of_life/simulation/universe.rs +++ b/CLI/rust/src/game_of_life/simulation/universe.rs @@ -7,15 +7,15 @@ use std::ops::Index; #[derive(Debug, Clone, PartialEq)] pub(crate) struct Universe { pub opts: Opts, - pub current: Vec<Plane>, - pub future: Vec<Plane>, + pub current: Plane<Plane<bool>>, + pub future: Plane<Plane<bool>>, } impl Index<isize> for Universe { - type Output = Plane; - fn index(&self, idx: isize) -> &Plane { - let len = self.current.len() as isize; - &self.current[circular_index(idx, len)] + type Output = Plane<bool>; + fn index(&self, idx: isize) -> &Plane<bool> { + let len = self.current.0.len() as isize; + &self.current[circular_index(idx, len) as isize] } } @@ -36,12 +36,12 @@ mod index { }; let u = Universe { opts, - current: vec![ + current: Plane(vec![ Plane(vec![false; 5]), Plane(vec![false, false, true, false, false]), Plane(vec![false; 5]), - ], - future: vec![Plane(vec![])], + ]), + future: Plane(vec![Plane(vec![])]), }; assert_eq!(u[-3][0], false); @@ -140,14 +140,14 @@ mod neighbors { fn center() { let u = Universe { opts: opts(), - future: vec![Plane(vec![])], - current: vec![ + future: Plane(vec![Plane(vec![])]), + current: Plane(vec![ Plane(vec![false, false, false, false, false]), Plane(vec![false, true, true, true, false]), Plane(vec![false, true, true, true, false]), Plane(vec![false, true, true, true, false]), Plane(vec![false, false, false, false, false]), - ], + ]), }; assert_eq!(u.neighbors(2, 2), vec![true; 8]); } @@ -156,14 +156,14 @@ mod neighbors { fn top_edge() { let u = Universe { opts: opts(), - future: vec![Plane(vec![])], - current: vec![ + future: Plane(vec![Plane(vec![])]), + current: Plane(vec![ Plane(vec![false, true, true, true, false]), Plane(vec![false, true, true, true, false]), Plane(vec![false, false, false, false, false]), Plane(vec![false, false, false, false, false]), Plane(vec![false, true, true, true, false]), - ], + ]), }; assert_eq!(u.neighbors(0, 2), vec![true; 8]); } @@ -172,14 +172,14 @@ mod neighbors { fn bottom_edge() { let u = Universe { opts: opts(), - future: vec![Plane(vec![])], - current: vec![ + future: Plane(vec![Plane(vec![])]), + current: Plane(vec![ Plane(vec![false, true, true, true, false]), Plane(vec![false, false, false, false, false]), Plane(vec![false, false, false, false, false]), Plane(vec![false, true, true, true, false]), Plane(vec![false, true, true, true, false]), - ], + ]), }; assert_eq!(u.neighbors(4, 2), vec![true; 8]); } @@ -188,14 +188,14 @@ mod neighbors { fn left_edge() { let u = Universe { opts: opts(), - future: vec![Plane(vec![])], - current: vec![ + future: Plane(vec![Plane(vec![])]), + current: Plane(vec![ Plane(vec![false, false, false, false, false]), Plane(vec![true, true, false, false, true]), Plane(vec![true, true, false, false, true]), Plane(vec![true, true, false, false, true]), Plane(vec![false, false, false, false, false]), - ], + ]), }; assert_eq!(u.neighbors(2, 0), vec![true; 8]); } @@ -204,14 +204,14 @@ mod neighbors { fn right_edge() { let u = Universe { opts: opts(), - future: vec![Plane(vec![])], - current: vec![ + future: Plane(vec![Plane(vec![])]), + current: Plane(vec![ Plane(vec![false, false, false, false, false]), Plane(vec![true, false, false, true, true]), Plane(vec![true, false, false, true, true]), Plane(vec![true, false, false, true, true]), Plane(vec![false, false, false, false, false]), - ], + ]), }; assert_eq!(u.neighbors(2, 4), vec![true; 8]); } @@ -220,14 +220,14 @@ mod neighbors { fn bottom_corner_edge() { let u = Universe { opts: opts(), - future: vec![Plane(vec![])], - current: vec![ + future: Plane(vec![Plane(vec![])]), + current: Plane(vec![ Plane(vec![true, false, false, true, true]), Plane(vec![false, false, false, false, false]), Plane(vec![false, false, false, false, false]), Plane(vec![true, false, false, true, true]), Plane(vec![true, false, false, true, true]), - ], + ]), }; assert_eq!(u.neighbors(4, 4), vec![true; 8]); } @@ -236,14 +236,14 @@ mod neighbors { fn top_corner_edge() { let u = Universe { opts: opts(), - future: vec![Plane(vec![])], - current: vec![ + future: Plane(vec![Plane(vec![])]), + current: Plane(vec![ Plane(vec![true, true, false, false, true]), Plane(vec![true, true, false, false, true]), Plane(vec![false, false, false, false, false]), Plane(vec![false, false, false, false, false]), Plane(vec![true, true, false, false, true]), - ], + ]), }; assert_eq!(u.neighbors(0, 0), vec![true; 8]); } |
