use std::{fmt::Debug, time::Instant}; pub fn minify_error(site_num: u8, actions: Vec, f: F, normalize: N) where F: Fn(u8, &mut [T]), N: Fn(u8, &mut [T]) -> Vec, T: Clone + Debug, { std::panic::set_hook(Box::new(|_info| { // ignore panic output // println!("{:?}", _info); })); let f_ref: *const _ = &f; let f_ref: usize = f_ref as usize; #[allow(clippy::redundant_clone)] let mut actions_clone = actions.clone(); let action_ref: usize = (&mut actions_clone) as *mut _ as usize; #[allow(clippy::blocks_in_conditions)] if std::panic::catch_unwind(|| { // SAFETY: test let f = unsafe { &*(f_ref as *const F) }; // SAFETY: test let actions_ref = unsafe { &mut *(action_ref as *mut Vec) }; f(site_num, actions_ref); }) .is_ok() { println!("No Error Found"); return; } let mut minified = actions.clone(); let mut candidates = Vec::new(); for i in 0..actions.len() { let mut new = actions.clone(); new.remove(i); candidates.push(new); } println!("Minifying..."); let start = Instant::now(); while let Some(candidate) = candidates.pop() { let f_ref: *const _ = &f; let f_ref: usize = f_ref as usize; let mut actions_clone = candidate.clone(); let action_ref: usize = (&mut actions_clone) as *mut _ as usize; #[allow(clippy::blocks_in_conditions)] if std::panic::catch_unwind(|| { // SAFETY: test let f = unsafe { &*(f_ref as *const F) }; // SAFETY: test let actions_ref = unsafe { &mut *(action_ref as *mut Vec) }; f(site_num, actions_ref); }) .is_err() { for i in 0..candidate.len() { let mut new = candidate.clone(); new.remove(i); candidates.push(new); } if candidate.len() < minified.len() { minified = candidate; println!("New min len={}", minified.len()); } if candidates.len() > 40 { candidates.drain(0..30); } } if start.elapsed().as_secs() > 10 && minified.len() <= 4 { break; } if start.elapsed().as_secs() > 60 { break; } } let minified = normalize(site_num, &mut minified); println!( "Old Length {}, New Length {}", actions.len(), minified.len() ); dbg!(&minified); if actions.len() > minified.len() { minify_error(site_num, minified, f, normalize); } }