From 6b7681bad6b61a589cf34dc3e57503ee1087e89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Wo=C5=BAniak?= Date: Mon, 16 Sep 2024 12:32:01 +0200 Subject: [PATCH] Fix writter --- maze/src/lib.rs | 74 +++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/maze/src/lib.rs b/maze/src/lib.rs index 269938d..59f6cfa 100644 --- a/maze/src/lib.rs +++ b/maze/src/lib.rs @@ -451,12 +451,22 @@ impl AsciiBroad { } } -struct BufWriter<'s>(&'s mut [MazePart]); +struct BufWriter<'s>(&'s mut [MazePart], usize); impl<'s> BufWriter<'s> { + pub fn new(b: &'s mut [MazePart]) -> Self { + Self(b, 0) + } pub fn push(&mut self, part: MazePart) { - self.0[0] = part; - self.0 = &mut self.0[1..]; + self.0[self.1] = part; + self.1 += 1; + } + pub fn copy(&mut self, src: &[MazePart]) { + src.iter() + .take_while(|p| **p != MazePart::Noop) + .for_each(|p| { + self.push(*p); + }); } } @@ -464,22 +474,12 @@ pub struct BinaryMap; impl BinaryMap { fn format(&self, grid: &Grid, buffer: &mut [MazePart]) { - let push = |p: MazePart, buffer: &mut [MazePart]| { - buffer[0] = p; - &mut buffer[1..] - }; - let copy = |src: &[MazePart], dst: &mut [MazePart]| { - src.iter() - .take_while(|p| **p != MazePart::Noop) - .for_each(|p| { - dst = push(*p, dst); - }); - }; + let mut bw = BufWriter::new(buffer); - buffer = push(MazePart::Wall, buffer); + bw.push(MazePart::Wall); (0..X).into_iter().for_each(|_| { - push(MazePart::Wall, buffer); - push(MazePart::Wall, buffer); + bw.push(MazePart::Wall); + bw.push(MazePart::Wall); }); let mut top_line = [MazePart::Noop; SIZE]; @@ -488,34 +488,28 @@ impl BinaryMap { for y in 0..Y { top_line.fill(MazePart::Noop); bottom_line.fill(MazePart::Noop); - let tl = &mut top_line; - let bl = &mut bottom_line; + let mut tl = BufWriter::new(&mut top_line); + let mut bl = BufWriter::new(&mut bottom_line); - push(MazePart::Wall, tl); - push(MazePart::Wall, bl); + tl.push(MazePart::Wall); + bl.push(MazePart::Wall); for x in 0..X { - push(MazePart::Passage, tl); - push( - if grid.is_carved((x, y), Cell::EAST) { - MazePart::Passage - } else { - MazePart::Wall - }, - tl, - ); + tl.push(MazePart::Passage); + tl.push(if grid.is_carved((x, y), Cell::EAST) { + MazePart::Passage + } else { + MazePart::Wall + }); - push( - if grid.is_carved((x, y), Cell::SOUTH) { - MazePart::Passage - } else { - MazePart::Wall - }, - bl, - ); + bl.push(if grid.is_carved((x, y), Cell::SOUTH) { + MazePart::Passage + } else { + MazePart::Wall + }); } - copy(&top_line, buffer); - copy(&bottom_line, buffer); + bw.copy(&top_line); + bw.copy(&bottom_line); } } }