use crate::code::ASTMetadata;
use super::common::{
ContainmentCtx, DeltaTable, ForestDist, PostorderIndexer, UnitCostModel, forest_dist,
};
pub(crate) fn compute_delta_zhang_shasha(
before: &PostorderIndexer,
after: &PostorderIndexer,
before_meta: &ASTMetadata,
after_meta: &ASTMetadata,
cost_model: &UnitCostModel,
containment: Option<&ContainmentCtx>,
) -> DeltaTable {
let mut delta = DeltaTable::new(before.size.max(1), after.size.max(1));
if before.size == 0 || after.size == 0 {
return delta;
}
let mut before_keyroots = before.keyroots.clone();
before_keyroots.sort_by_key(|&pre| before.pre_to_post[pre]);
let mut after_keyroots = after.keyroots.clone();
after_keyroots.sort_by_key(|&pre| after.pre_to_post[pre]);
let mut forestdist = ForestDist::new(before.size + 1, after.size + 1, 0);
for &kr1_pre in &before_keyroots {
let kr1_boundary = before.pre_to_post[kr1_pre] + 1;
for &kr2_pre in &after_keyroots {
let kr2_boundary = after.pre_to_post[kr2_pre] + 1;
forest_dist(
before,
after,
before_meta,
after_meta,
cost_model,
containment,
&mut delta,
kr1_boundary,
kr2_boundary,
&mut forestdist,
true,
);
}
}
delta
}