diff --git a/src/algos/go_down.rs b/src/algos/go_down.rs index 9b1eae9..83619f0 100644 --- a/src/algos/go_down.rs +++ b/src/algos/go_down.rs @@ -11,14 +11,14 @@ fn goDown( let mut p = root; match dir { BinaryTreeDirection::LEFT => loop { - match ctx.getLeftChild(p) { + match ctx.getLeftChild(p.clone()) { None => return p, Some(c) => p = c, } }, BinaryTreeDirection::RIGHT => loop { - match ctx.getRightChild(p) { + match ctx.getRightChild(p.clone()) { None => return p, Some(c) => p = c, } @@ -34,14 +34,14 @@ fn goDownDirected( let mut p = root; match dir { DirectedBinaryTreeDirection::FORWARD => loop { - match ctx.getForwardChild(p) { + match ctx.getForwardChild(p.clone()) { None => return p, Some(c) => p = c, } }, DirectedBinaryTreeDirection::OPPOSITE => loop { - match ctx.getOppositeChild(p) { + match ctx.getOppositeChild(p.clone()) { None => return p, Some(c) => p = c, } diff --git a/src/algos/swap/neighbors.rs b/src/algos/swap/neighbors.rs index fd5bed1..13ce140 100644 --- a/src/algos/swap/neighbors.rs +++ b/src/algos/swap/neighbors.rs @@ -11,28 +11,28 @@ unsafe fn swapNeighbors< + BinaryTreeParentSetterContext, >( ctx: &mut Ctx, - parentLocation: &mut impl Parent2NodeSetterClojure, + parentLocation: &mut impl Parent2NodeSetterClojure, grandparent: Option, parent: Ctx::NodeRef, child: Ctx::NodeRef, ) { - ctx.xSetParent(child, grandparent); - parentLocation.setChild(child); - ctx.xSetForwardChild(parent, ctx.getForwardChild(child)); + ctx.xSetParent(child.clone(), grandparent); + parentLocation.setChild(child.clone()); + ctx.xSetForwardChild(parent.clone(), ctx.getForwardChild(child.clone())); - let oppositeChild = ctx.getOppositeChild(parent); - ctx.xSetOppositeChild(parent, ctx.getOppositeChild(child)); - ctx.xSetOppositeChild(child, oppositeChild); + let oppositeChild = ctx.getOppositeChild(parent.clone()); + ctx.xSetOppositeChild(parent.clone(), ctx.getOppositeChild(child.clone())); + ctx.xSetOppositeChild(child.clone(), oppositeChild); - if let Some(n) = ctx.getOppositeChild(child) { - ctx.setParent(n, child) + if let Some(n) = ctx.getOppositeChild(child.clone()) { + ctx.setParent(n, child.clone()) } - if let Some(n) = ctx.getOppositeChild(parent) { - ctx.setParent(n, parent) + if let Some(n) = ctx.getOppositeChild(parent.clone()) { + ctx.setParent(n, parent.clone()) } - if let Some(n) = ctx.getForwardChild(child) { - ctx.setParent(n, parent) + if let Some(n) = ctx.getForwardChild(child.clone()) { + ctx.setParent(n, parent.clone()) } - ctx.setForwardChild(child, parent); + ctx.setForwardChild(child.clone(), parent.clone()); ctx.setParent(parent, child); } diff --git a/src/context.rs b/src/context.rs index 10b0f9e..5e3e36c 100644 --- a/src/context.rs +++ b/src/context.rs @@ -1,5 +1,7 @@ +pub trait NodeRef: Sized + Clone {} + pub trait NodeRefContainer { - type NodeRef: Sized + Copy; + type NodeRef: NodeRef; } pub trait BinaryTreeRootGetter: NodeRefContainer { diff --git a/src/parent2node/dynamic_wrappers.rs b/src/parent2node/dynamic_wrappers.rs index f7d9e46..40646a0 100644 --- a/src/parent2node/dynamic_wrappers.rs +++ b/src/parent2node/dynamic_wrappers.rs @@ -82,10 +82,10 @@ macro_rules! _get_child { match self.dir { None => return self.ctx.getRoot(), Some($dir_enum_lbl::$d1_lbl) => unsafe { - self.ctx.$d1_get (*self.node.node.deref()) + self.ctx.$d1_get ((*self.node.node.deref()).clone()) }, Some($dir_enum_lbl::$d2_lbl) => unsafe { - self.ctx.$d2_get (*self.node.node.deref()) + self.ctx.$d2_get ((*self.node.node.deref()).clone()) } } } @@ -118,10 +118,10 @@ macro_rules! _set_child { match self.dir { None => self.ctx.xSetRoot(newChild), Some($dir_enum_lbl::$d1_lbl) => unsafe { - self.ctx.$d1_xset (*self.node.node.deref(), newChild) + self.ctx.$d1_xset ((*self.node.node.deref()).clone(), newChild) }, Some($dir_enum_lbl::$d2_lbl) => unsafe { - self.ctx.$d2_xset (*self.node.node.deref(), newChild) + self.ctx.$d2_xset ((*self.node.node.deref()).clone(), newChild) } }; return; @@ -131,10 +131,10 @@ macro_rules! _set_child { match self.dir { None => self.ctx.setRoot(newChild), Some($dir_enum_lbl::$d1_lbl) => unsafe { - self.ctx.$d1_set (*self.node.node.deref(), newChild) + self.ctx.$d1_set ((*self.node.node.deref()).clone(), newChild) }, Some($dir_enum_lbl::$d2_lbl) => unsafe { - self.ctx.$d2_set (*self.node.node.deref(), newChild) + self.ctx.$d2_set ((*self.node.node.deref()).clone(), newChild) } }; return; @@ -144,10 +144,10 @@ macro_rules! _set_child { match self.dir { None => self.ctx.clearRoot(), Some($dir_enum_lbl::$d1_lbl) => unsafe { - self.ctx.$d1_clear (*self.node.node.deref()) + self.ctx.$d1_clear ((*self.node.node.deref()).clone()) }, Some($dir_enum_lbl::$d2_lbl) => unsafe { - self.ctx.$d2_clear (*self.node.node.deref()) + self.ctx.$d2_clear ((*self.node.node.deref()).clone()) } }; return; diff --git a/src/parent2node/fixed_wrapper.rs b/src/parent2node/fixed_wrapper.rs index 61c2e23..e7745ca 100644 --- a/src/parent2node/fixed_wrapper.rs +++ b/src/parent2node/fixed_wrapper.rs @@ -100,7 +100,7 @@ macro_rules! _get_child { for $name <&'ctx $($mut)? Ctx, Ctx::NodeRef> { fn getChild(&self) -> Option { - return self.ctx.$fn (self.node); + return self.ctx.$fn (self.node.clone()); } } }; @@ -143,15 +143,15 @@ macro_rules! _set_child { ($name:ident $ctx:ident $xset:ident $set:ident $clear:ident) => { impl<'ctx, Ctx: $ctx> Parent2NodeSetterClojure for $name<&'ctx mut Ctx, Ctx::NodeRef> { fn xSetChild(&mut self, newChild: Option) { - self.ctx.$xset(self.node, newChild); + self.ctx.$xset(self.node.clone(), newChild); } fn setChild(&mut self, newChild: Self::NodeRef) { - self.ctx.$set(self.node, newChild); + self.ctx.$set(self.node.clone(), newChild); } fn clearChild(&mut self) { - self.ctx.$clear(self.node); + self.ctx.$clear(self.node.clone()); } } };