use super::{MissingPartTwo, ParseInput, Solution, SolutionRunner};
const PART_ONE_ONLY: u16 = 1;
const FULL: u16 = 2;
const SHARED_INPUT_FULL: u16 = 3;
impl<'a, T, const DAY: u32, const PART: u8> Solution<'a, DAY, PART> for &T
where
T: Solution<'a, DAY, PART>,
{
type Input = <T as Solution<'a, DAY, PART>>::Input;
type Output = <T as Solution<'a, DAY, PART>>::Output;
fn solve(&'a self, input: &Self::Input) -> Self::Output {
<T as Solution<'a, DAY, PART>>::solve(&self, input)
}
}
impl<'a, T, const DAY: u32, const PART: u8> ParseInput<'a, DAY, PART> for &T
where
T: ParseInput<'a, DAY, PART>,
{
type Parsed = <T as ParseInput<'a, DAY, PART>>::Parsed;
fn parse_input(&'a self, input: &'a str) -> Self::Parsed {
<T as ParseInput<'a, DAY, PART>>::parse_input(&self, input)
}
}
impl<'a, T: 'a, const DAY: u32> SolutionRunner<'a, DAY, SHARED_INPUT_FULL> for &'a &'a T
where
&'a &'a T: Solution<'a, DAY, 1>
+ Solution<'a, DAY, 2>
+ ParseInput<'a, DAY, 1>
+ Solution<'a, DAY, 1, Input = <Self as ParseInput<'a, DAY, 1>>::Parsed>
+ Solution<'a, DAY, 2, Input = <Self as ParseInput<'a, DAY, 1>>::Parsed>,
{
fn run(&'a self, input: &'a str) {
let parsed_input = <Self as ParseInput<'a, DAY, 1>>::parse_input(&self, &input);
let part1_output = <Self as Solution<'a, DAY, 1>>::solve(&self, &parsed_input);
let part2_output = <Self as Solution<'a, DAY, 2>>::solve(&self, &parsed_input);
println!("Day {DAY}\npart 1: {part1_output:?}\npart 2: {part2_output:?}");
}
}
impl<'a, T: 'a, const DAY: u32> SolutionRunner<'a, DAY, FULL> for &'a T
where
&'a T: Solution<'a, DAY, 1>
+ Solution<'a, DAY, 2>
+ ParseInput<'a, DAY, 1>
+ ParseInput<'a, DAY, 2>
+ Solution<'a, DAY, 1, Input = <Self as ParseInput<'a, DAY, 1>>::Parsed>
+ Solution<'a, DAY, 2, Input = <Self as ParseInput<'a, DAY, 2>>::Parsed>,
{
fn run(&'a self, input: &'a str) {
let parsed_input = <Self as ParseInput<DAY, 1>>::parse_input(&self, input);
let part1_output = <Self as Solution<'a, DAY, 1>>::solve(&self, &parsed_input);
let parsed_input = <Self as ParseInput<DAY, 2>>::parse_input(&self, input);
let part2_output = <Self as Solution<'a, DAY, 2>>::solve(&self, &parsed_input);
println!("Day {DAY}\npart 1: {part1_output:?}\npart 2: {part2_output:?}");
}
}
impl<'a, T, const DAY: u32> SolutionRunner<'a, DAY, PART_ONE_ONLY> for T
where
T: Solution<'a, DAY, 1>
+ ParseInput<'a, DAY, 1>
+ Solution<'a, DAY, 1, Input = <Self as ParseInput<'a, DAY, 1>>::Parsed>
+ MissingPartTwo<DAY>,
{
fn run(&'a self, input: &'a str) {
let parsed_input = <Self as ParseInput<DAY, 1>>::parse_input(&self, input);
let part1_output = <Self as Solution<'a, DAY, 1>>::solve(&self, &parsed_input);
println!("Day {DAY}\npart 1: {part1_output:?}");
}
}