mirror of
https://github.com/loro-dev/loro.git
synced 2025-01-23 13:39:12 +00:00
fffd49b5fa
* feat: fractional index --------- Co-authored-by: Zixuan Chen <remch183@outlook.com>
89 lines
2.6 KiB
Rust
89 lines
2.6 KiB
Rust
use std::{fmt::Debug, time::Instant};
|
|
|
|
pub fn minify_error<T, F, N>(site_num: u8, actions: Vec<T>, f: F, normalize: N)
|
|
where
|
|
F: Fn(u8, &mut [T]),
|
|
N: Fn(u8, &mut [T]) -> Vec<T>,
|
|
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<T>) };
|
|
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<T>) };
|
|
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);
|
|
}
|
|
}
|