summaryrefslogtreecommitdiffstats
path: root/CLI/rust/src/game_of_life/simulation
diff options
context:
space:
mode:
authora14m <[email protected]>2021-04-07 17:46:30 +0200
committera14m <[email protected]>2021-04-07 17:46:30 +0200
commitb087dea8fde79d48f14684f7415c493b917f5c64 (patch)
tree6099976d46fe14dff30deda2651e596b53f91ff0 /CLI/rust/src/game_of_life/simulation
parentffb998e6b6d45b50cc1eb46e8d0b76ca24b60b15 (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.rs10
-rw-r--r--CLI/rust/src/game_of_life/simulation/universe.rs60
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]);
}