summaryrefslogtreecommitdiff
path: root/src/game/map.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/map.rs')
-rw-r--r--src/game/map.rs53
1 files changed, 19 insertions, 34 deletions
diff --git a/src/game/map.rs b/src/game/map.rs
index c062c8f..45d25fd 100644
--- a/src/game/map.rs
+++ b/src/game/map.rs
@@ -1,13 +1,13 @@
-use crate::geometry::*;
use crate::constants::*;
+use crate::geometry::*;
#[derive(Default, Debug, PartialEq, Eq, Clone)]
pub struct Map {
- cells: [u64; MAP_U64S]
+ cells: [u64; MAP_U64S],
}
impl Map {
- pub fn at(&self, p: Point2d<i8>) -> Option<bool> {
+ fn internal_index(p: Point2d<i8>) -> Option<(usize, usize)> {
if p.y < 0 || p.y as usize >= MAP_SIZE {
None
} else {
@@ -18,47 +18,32 @@ impl Map {
let global_bit = row_data.start_bit + p.x as usize - row_data.x_offset;
let integer = global_bit / 64;
let bit = global_bit % 64;
- let mask = 1 << bit;
- Some(self.cells[integer] & mask != 0)
+ Some((integer, bit))
}
}
}
+ pub fn at(&self, p: Point2d<i8>) -> Option<bool> {
+ Map::internal_index(p).map(|(integer, bit)| {
+ let mask = 1 << bit;
+ self.cells[integer] & mask != 0
+ })
+ }
+
pub fn set(&mut self, p: Point2d<i8>) {
- if p.y < 0 || p.y as usize >= MAP_SIZE {
- debug_assert!(false, "Tried to set an out of bounds bit, {:?}", p);
+ if let Some((integer, bit)) = Map::internal_index(p) {
+ let mask = 1 << bit;
+ self.cells[integer] |= mask;
} else {
- let row_data = &MAP_ROW_SIZE[p.y as usize];
- if p.x < row_data.x_offset as i8 || p.x as usize >= row_data.x_offset + row_data.len() {
- debug_assert!(false, "Tried to set an out of bounds bit, {:?}", p);
- } else {
- let global_bit = row_data.start_bit + p.x as usize - row_data.x_offset;
- let integer = global_bit / 64;
- let bit = global_bit % 64;
- let mask = 1 << bit;
- self.cells[integer] |= mask;
- }
+ panic!("Tried to set an out of bounds bit, {:?}", p);
}
}
pub fn clear(&mut self, p: Point2d<i8>) {
- if p.y < 0 || p.y as usize >= MAP_SIZE {
- debug_assert!(false, "Tried to set an out of bounds bit, {:?}", p);
+ if let Some((integer, bit)) = Map::internal_index(p) {
+ let mask = !(1 << bit);
+ self.cells[integer] &= mask;
} else {
- let row_data = &MAP_ROW_SIZE[p.y as usize];
- if p.x < row_data.x_offset as i8 || p.x as usize >= row_data.x_offset + row_data.len() {
- debug_assert!(false, "Tried to set an out of bounds bit, {:?}", p);
- } else {
- let global_bit = row_data.start_bit + p.x as usize - row_data.x_offset;
- let integer = global_bit / 64;
- let bit = global_bit % 64;
- let mask = !(1 << bit);
- self.cells[integer] &= mask;
- }
+ panic!("Tried to set an out of bounds bit, {:?}", p);
}
}
}
-
-#[cfg(test)]
-mod test {
- // TODO: Property test for at, set and clear
-}