1use crate::tree::StateTree;
2
3#[derive(Debug, PartialEq, Clone)]
5pub struct CopyFromPatch {
6 pub new_path: Vec<usize>,
7 pub old_path: Vec<usize>,
8}
9
10pub fn apply_patches(new_tree: &mut StateTree, old_tree: &StateTree, patches: &[CopyFromPatch]) {
21 for patch in patches {
22 let source_node = old_tree
23 .get_node(&patch.old_path)
24 .expect("Invalid old_path in patch");
25 let dest_node = new_tree
26 .get_node_mut(&patch.new_path)
27 .expect("Invalid new_path in patch");
28
29 match (source_node, dest_node) {
32 (
33 StateTree::Delay {
34 readidx: r_src,
35 writeidx: w_src,
36 data: d_src,
37 },
38 StateTree::Delay {
39 readidx: r_dest,
40 writeidx: w_dest,
41 data: d_dest,
42 },
43 ) => {
44 *r_dest = *r_src;
45 *w_dest = *w_src;
46 d_dest.copy_from_slice(d_src);
47 }
48 (StateTree::Mem { data: d_src }, StateTree::Mem { data: d_dest }) => {
49 d_dest.copy_from_slice(d_src);
50 }
51 (StateTree::Feed { data: d_src }, StateTree::Feed { data: d_dest }) => {
52 d_dest.copy_from_slice(d_src);
53 }
54 (StateTree::FnCall(_), StateTree::FnCall(_)) => (),
56 _ => panic!("Mismatched node types during patch application. This should not happen."),
58 }
59 }
60}