diff --git a/2022/src/common.rs b/2022/src/common.rs index caa3385..700a60a 100644 --- a/2022/src/common.rs +++ b/2022/src/common.rs @@ -1,7 +1,5 @@ -use std::{env, fmt::Display, str::FromStr}; - pub fn read_file(day: usize) -> String { - std::fs::read_to_string(env::var("AOC_INPUT").unwrap_or_else(|_| format!("inputs/day{:0>2}", day))).unwrap() + std::fs::read_to_string(std::env::var("AOC_INPUT").unwrap_or_else(|_| format!("inputs/day{:0>2}", day))).unwrap() } pub fn parse_nums(l: &str) -> Vec { @@ -12,6 +10,16 @@ pub fn parse_nums_comma(l: &str) -> Vec { l.trim().split(',').map(parse_num).collect() } -pub fn parse_num(s: &str) -> T { +#[cfg(debug_assertions)] +pub fn parse_num(s: &str) -> T { s.parse().unwrap_or_else(|_| panic!("Invalid number {s}")) } + +// For benchmarks. +// This function assumes that the input will always be valid numbers and is UB otherwise +#[cfg(not(debug_assertions))] +pub fn parse_num + std::ops::Add + std::ops::Mul>(s: &str) -> T { + let mut digits = s.bytes().map(|b| T::from(b - b'0')); + let start = unsafe { digits.next().unwrap_unchecked() }; + digits.fold(start, |acc, n| acc * T::from(10) + n) +}