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 /CLI/rust/src/game_of_life/simulation | |
| parent | ffb998e6b6d45b50cc1eb46e8d0b76ca24b60b15 (diff) | |
Refactor PLane impl to be generic to allow nesting
Wrap the outer vector in a plane to allow safer navigation
Diffstat (limited to 'CLI/rust/src/game_of_life/simulation')
| -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 |
2 files changed, 35 insertions, 35 deletions
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]); } |
