Skip to content

Commit 58445d7

Browse files
committed
Make everything unsafe
1 parent cd64439 commit 58445d7

File tree

1 file changed

+38
-47
lines changed

1 file changed

+38
-47
lines changed

src/day20.rs

Lines changed: 38 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,7 @@ fn inner_part1(s: &[u8]) -> u64 {
133133

134134
#[aoc(day20, part2)]
135135
pub fn part2(s: &str) -> u32 {
136-
#[expect(unused_unsafe)]
137-
unsafe {
138-
inner_part2(s.as_bytes())
139-
}
136+
unsafe { inner_part2(s.as_bytes()) }
140137
}
141138

142139
#[derive(Debug)]
@@ -155,7 +152,7 @@ const QUADS_NEEDED: usize = 20usize.div_ceil(QUAD_SIZE);
155152
unsafe fn inner_part2(s: &[u8]) -> u32 {
156153
let to_idx = |x, y| y as usize * SIZE1 + x as usize;
157154

158-
let start = memchr::memchr(b'S', s).unwrap();
155+
let start = memchr::memchr(b'S', s).unwrap_unchecked();
159156

160157
let mut lines = [const { heapless::Vec::<Line, 1024>::new() }; 4];
161158
let mut quads =
@@ -185,22 +182,23 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
185182

186183
let qx = (x / QUAD_SIZE as u8) as usize;
187184
let qy = (y / QUAD_SIZE as u8) as usize;
188-
quads[d as usize][qy * QUADS_SIZE + qx]
189-
.push(lines[d as usize].len())
190-
.unwrap();
185+
quads
186+
.get_unchecked_mut(d as usize)
187+
.get_unchecked_mut(qy * QUADS_SIZE + qx)
188+
.push_unchecked(lines.get_unchecked(d as usize).len());
191189

192190
let mut prev_qx = qx;
193191
let mut prev_qy = qy;
194192
while *s.get_unchecked(to_idx(x, y)) != b'E' {
195193
let next = d.step(to_idx(x, y));
196194

197-
if s[next] == b'#' {
195+
if *s.get_unchecked(next) == b'#' {
198196
cur_line.line_end = d.select_crosline(x, y);
199-
lines[d as usize].push(cur_line).unwrap();
197+
lines.get_unchecked_mut(d as usize).push_unchecked(cur_line);
200198

201199
for side in d.sides() {
202200
let side_i = side.step(to_idx(x, y));
203-
if s[side_i] != b'#' {
201+
if *s.get_unchecked(side_i) != b'#' {
204202
d = side;
205203
match d {
206204
Dir::N => y -= 1,
@@ -221,9 +219,10 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
221219
};
222220
let qx = x as usize / QUAD_SIZE;
223221
let qy = y as usize / QUAD_SIZE;
224-
quads[d as usize][qy * QUADS_SIZE + qx]
225-
.push(lines[d as usize].len())
226-
.unwrap();
222+
quads
223+
.get_unchecked_mut(d as usize)
224+
.get_unchecked_mut(qy * QUADS_SIZE + qx)
225+
.push_unchecked(lines.get_unchecked(d as usize).len());
227226
prev_qy = qy;
228227
prev_qx = qx;
229228
} else {
@@ -242,17 +241,18 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
242241

243242
if prev_qy != qy || prev_qx != qx {
244243
cur_line.line_end = pos_line_end;
245-
lines[d as usize].push(cur_line).unwrap();
244+
lines.get_unchecked_mut(d as usize).push_unchecked(cur_line);
246245

247246
cur_line = Line {
248247
start_ns: ns,
249248
line_start: d.select_crosline(x, y),
250249
line_offset: d.select_inline(x, y),
251250
line_end: 0,
252251
};
253-
quads[d as usize][qy * QUADS_SIZE + qx]
254-
.push(lines[d as usize].len())
255-
.unwrap();
252+
quads
253+
.get_unchecked_mut(d as usize)
254+
.get_unchecked_mut(qy * QUADS_SIZE + qx)
255+
.push_unchecked(lines.get_unchecked(d as usize).len());
256256
}
257257

258258
prev_qy = qy;
@@ -269,8 +269,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
269269
for qy in
270270
qy.saturating_sub(QUADS_NEEDED)..qy.wrapping_add(QUADS_NEEDED + 1).min(QUADS_SIZE)
271271
{
272-
for line_i in &quads[Dir::N as usize][qy * QUADS_SIZE + qx] {
273-
let Some(line) = lines[Dir::N as usize].get(*line_i) else {
272+
for line_i in quads
273+
.get_unchecked(Dir::N as usize)
274+
.get_unchecked(qy * QUADS_SIZE + qx)
275+
{
276+
let Some(line) = lines.get_unchecked(Dir::N as usize).get(*line_i) else {
274277
continue;
275278
};
276279
let dist = x.abs_diff(line.line_offset as i16) as i16;
@@ -295,15 +298,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
295298
sum += (cheat_start - cheat_end) as u32 + 1;
296299
}
297300
}
298-
}
299-
}
300-
for qx in qx.saturating_sub(QUADS_NEEDED)..qx.wrapping_add(QUADS_NEEDED + 1).min(QUADS_SIZE)
301-
{
302-
for qy in
303-
qy.saturating_sub(QUADS_NEEDED)..qy.wrapping_add(QUADS_NEEDED + 1).min(QUADS_SIZE)
304-
{
305-
for line_i in &quads[Dir::E as usize][qy * QUADS_SIZE + qx] {
306-
let Some(line) = lines[Dir::E as usize].get(*line_i) else {
301+
for line_i in quads
302+
.get_unchecked(Dir::E as usize)
303+
.get_unchecked(qy * QUADS_SIZE + qx)
304+
{
305+
let Some(line) = lines.get_unchecked(Dir::E as usize).get(*line_i) else {
307306
continue;
308307
};
309308
let dist = y.abs_diff(line.line_offset as i16) as i16;
@@ -328,15 +327,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
328327
sum += (cheat_end - cheat_start) as u32 + 1;
329328
}
330329
}
331-
}
332-
}
333-
for qx in qx.saturating_sub(QUADS_NEEDED)..qx.wrapping_add(QUADS_NEEDED + 1).min(QUADS_SIZE)
334-
{
335-
for qy in
336-
qy.saturating_sub(QUADS_NEEDED)..qy.wrapping_add(QUADS_NEEDED + 1).min(QUADS_SIZE)
337-
{
338-
for line_i in &quads[Dir::S as usize][qy * QUADS_SIZE + qx] {
339-
let Some(line) = lines[Dir::S as usize].get(*line_i) else {
330+
for line_i in quads
331+
.get_unchecked(Dir::S as usize)
332+
.get_unchecked(qy * QUADS_SIZE + qx)
333+
{
334+
let Some(line) = lines.get_unchecked(Dir::S as usize).get(*line_i) else {
340335
continue;
341336
};
342337
let dist = x.abs_diff(line.line_offset as i16) as i16;
@@ -361,15 +356,11 @@ unsafe fn inner_part2(s: &[u8]) -> u32 {
361356
sum += (cheat_end - cheat_start) as u32 + 1;
362357
}
363358
}
364-
}
365-
}
366-
for qx in qx.saturating_sub(QUADS_NEEDED)..qx.wrapping_add(QUADS_NEEDED + 1).min(QUADS_SIZE)
367-
{
368-
for qy in
369-
qy.saturating_sub(QUADS_NEEDED)..qy.wrapping_add(QUADS_NEEDED + 1).min(QUADS_SIZE)
370-
{
371-
for line_i in &quads[Dir::W as usize][qy * QUADS_SIZE + qx] {
372-
let Some(line) = lines[Dir::W as usize].get(*line_i) else {
359+
for line_i in quads
360+
.get_unchecked(Dir::W as usize)
361+
.get_unchecked(qy * QUADS_SIZE + qx)
362+
{
363+
let Some(line) = lines.get_unchecked(Dir::W as usize).get(*line_i) else {
373364
continue;
374365
};
375366
let dist = y.abs_diff(line.line_offset as i16) as i16;

0 commit comments

Comments
 (0)