use crate::tree::StateTree;
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
pub struct CopyFromPatch {
pub old_path: Vec<usize>,
pub new_path: Vec<usize>,
}
pub fn apply_patches(new_tree: &mut StateTree, old_tree: &StateTree, patches: &[CopyFromPatch]) {
for patch in patches {
let source_node = old_tree
.get_node(&patch.old_path)
.expect("Invalid old_path in patch");
let dest_node = new_tree
.get_node_mut(&patch.new_path)
.expect("Invalid new_path in patch");
match (source_node, dest_node) {
(
StateTree::Delay {
readidx: r_src,
writeidx: w_src,
data: d_src,
},
StateTree::Delay {
readidx: r_dest,
writeidx: w_dest,
data: d_dest,
},
) => {
*r_dest = *r_src;
*w_dest = *w_src;
d_dest.copy_from_slice(d_src);
}
(StateTree::Mem { data: d_src }, StateTree::Mem { data: d_dest }) => {
d_dest.copy_from_slice(d_src);
}
(StateTree::Feed { data: d_src }, StateTree::Feed { data: d_dest }) => {
d_dest.copy_from_slice(d_src);
}
(StateTree::FnCall(_), StateTree::FnCall(_)) => (),
_ => panic!("Mismatched node types during patch application. This should not happen."),
}
}
}