Simplified swaps with relation setter contexts
This commit is contained in:
parent
97a27629a1
commit
03b6925b0c
@ -1,86 +1,58 @@
|
||||
use crate::algo::set_relation::{setRelation, xSetRelation};
|
||||
use crate::base_context::BinaryTreeParentSetterContext;
|
||||
use crate::base_context::{
|
||||
BinaryTreeChildrenGetterContext, BinaryTreeChildrenSetterContext, BinaryTreeParentGetterContext,
|
||||
};
|
||||
use crate::directed_context::{
|
||||
DirectedBinaryTreeChildrenGetterContext, DirectedBinaryTreeChildrenSetterContext,
|
||||
};
|
||||
use crate::parent2node_clojure::{
|
||||
FixedForwardParent2NodeGetterClojureFromDirectedContext as P2N_F,
|
||||
FixedLeftParent2NodeGetterClojureFromContext as P2N_L,
|
||||
FixedOppositeParent2NodeGetterClojureFromDirectedContext as P2N_O,
|
||||
FixedRightParent2NodeGetterClojureFromContext as P2N_R,
|
||||
Parent2NodeSetterClojure,
|
||||
ParentProviderClojure,
|
||||
use crate::base_context::BinaryTreeChildrenGetterContext;
|
||||
use crate::directed_context::DirectedBinaryTreeChildrenGetterContext;
|
||||
use crate::relation_context::{
|
||||
BinaryTreeRelationSetterContext, DirectedBinaryTreeRelationSetterContext,
|
||||
Parent2NodeRelationSetterClojure,
|
||||
};
|
||||
|
||||
pub unsafe fn swapDistant<
|
||||
Ctx: BinaryTreeChildrenGetterContext
|
||||
+ BinaryTreeChildrenSetterContext
|
||||
+ BinaryTreeParentGetterContext
|
||||
+ BinaryTreeParentSetterContext,
|
||||
Ctx: BinaryTreeChildrenGetterContext + BinaryTreeRelationSetterContext,
|
||||
>(
|
||||
ctx: &mut Ctx,
|
||||
parent1: &mut (
|
||||
impl Parent2NodeSetterClojure<NodeRef = Ctx::NodeRef>
|
||||
+ ParentProviderClojure<NodeRef = Ctx::NodeRef>
|
||||
),
|
||||
parent1: &mut impl Parent2NodeRelationSetterClojure<NodeRef = Ctx::NodeRef>,
|
||||
node1: Ctx::NodeRef,
|
||||
parent2: &mut (
|
||||
impl Parent2NodeSetterClojure<NodeRef = Ctx::NodeRef>
|
||||
+ ParentProviderClojure<NodeRef = Ctx::NodeRef>
|
||||
),
|
||||
parent2: &mut impl Parent2NodeRelationSetterClojure<NodeRef = Ctx::NodeRef>,
|
||||
node2: Ctx::NodeRef,
|
||||
) {
|
||||
setRelation(parent1, node2.clone());
|
||||
setRelation(parent2, node1.clone());
|
||||
parent1.setRelation(node2.clone());
|
||||
parent2.setRelation(node1.clone());
|
||||
|
||||
{
|
||||
let child1 = ctx.getLeftChild(node1.clone());
|
||||
let child2 = ctx.getLeftChild(node2.clone());
|
||||
xSetRelation(&mut P2N_L::wrap_mut(ctx, node2.clone()), child1);
|
||||
xSetRelation(&mut P2N_L::wrap_mut(ctx, node1.clone()), child2);
|
||||
ctx.xSetLeftRelation(node2.clone(), child1);
|
||||
ctx.xSetLeftRelation(node1.clone(), child2);
|
||||
}
|
||||
{
|
||||
let child1 = ctx.getRightChild(node1.clone());
|
||||
let child2 = ctx.getRightChild(node2.clone());
|
||||
xSetRelation(&mut P2N_R::wrap_mut(ctx, node2.clone()), child1);
|
||||
xSetRelation(&mut P2N_R::wrap_mut(ctx, node1.clone()), child2);
|
||||
ctx.xSetRightRelation(node2.clone(), child1);
|
||||
ctx.xSetRightRelation(node1.clone(), child2);
|
||||
}
|
||||
}
|
||||
|
||||
pub unsafe fn swapDistantDirected<
|
||||
Ctx: DirectedBinaryTreeChildrenGetterContext
|
||||
+ DirectedBinaryTreeChildrenSetterContext
|
||||
+ BinaryTreeParentGetterContext
|
||||
+ BinaryTreeParentSetterContext,
|
||||
Ctx: DirectedBinaryTreeChildrenGetterContext + DirectedBinaryTreeRelationSetterContext,
|
||||
>(
|
||||
ctx: &mut Ctx,
|
||||
parent1: &mut (
|
||||
impl Parent2NodeSetterClojure<NodeRef = Ctx::NodeRef>
|
||||
+ ParentProviderClojure<NodeRef = Ctx::NodeRef>
|
||||
),
|
||||
parent1: &mut impl Parent2NodeRelationSetterClojure<NodeRef = Ctx::NodeRef>,
|
||||
node1: Ctx::NodeRef,
|
||||
parent2: &mut (
|
||||
impl Parent2NodeSetterClojure<NodeRef = Ctx::NodeRef>
|
||||
+ ParentProviderClojure<NodeRef = Ctx::NodeRef>
|
||||
),
|
||||
parent2: &mut impl Parent2NodeRelationSetterClojure<NodeRef = Ctx::NodeRef>,
|
||||
node2: Ctx::NodeRef,
|
||||
) {
|
||||
setRelation(parent1, node2.clone());
|
||||
setRelation(parent2, node1.clone());
|
||||
parent1.setRelation(node2.clone());
|
||||
parent2.setRelation(node1.clone());
|
||||
|
||||
{
|
||||
let child1 = ctx.getForwardChild(node1.clone());
|
||||
let child2 = ctx.getForwardChild(node2.clone());
|
||||
xSetRelation(&mut P2N_F::wrap_mut(ctx, node2.clone()), child1);
|
||||
xSetRelation(&mut P2N_F::wrap_mut(ctx, node1.clone()), child2);
|
||||
ctx.xSetForwardRelation(node2.clone(), child1);
|
||||
ctx.xSetForwardRelation(node1.clone(), child2);
|
||||
}
|
||||
{
|
||||
let child1 = ctx.getOppositeChild(node1.clone());
|
||||
let child2 = ctx.getOppositeChild(node2.clone());
|
||||
xSetRelation(&mut P2N_O::wrap_mut(ctx, node2.clone()), child1);
|
||||
xSetRelation(&mut P2N_O::wrap_mut(ctx, node1.clone()), child2);
|
||||
ctx.xSetOppositeRelation(node2.clone(), child1);
|
||||
ctx.xSetOppositeRelation(node1.clone(), child2);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,40 +1,20 @@
|
||||
use crate::base_context::BinaryTreeParentGetterContext;
|
||||
use crate::base_context::BinaryTreeParentSetterContext;
|
||||
use crate::directed_context::DirectedBinaryTreeChildrenGetterContext;
|
||||
use crate::directed_context::DirectedBinaryTreeChildrenSetterContext;
|
||||
use crate::parent2node_clojure::{Parent2NodeSetterClojure, ParentProviderClojure};
|
||||
use crate::relation_context::{DirectedBinaryTreeRelationSetterContext, Parent2NodeRelationSetterClojure};
|
||||
|
||||
pub unsafe fn swapNeighbors<
|
||||
Ctx: DirectedBinaryTreeChildrenGetterContext
|
||||
+ DirectedBinaryTreeChildrenSetterContext
|
||||
+ BinaryTreeParentGetterContext
|
||||
+ BinaryTreeParentSetterContext,
|
||||
Ctx: DirectedBinaryTreeChildrenGetterContext
|
||||
+ DirectedBinaryTreeRelationSetterContext,
|
||||
>(
|
||||
ctx: &mut Ctx,
|
||||
grandparent: &mut (
|
||||
impl Parent2NodeSetterClojure<NodeRef = Ctx::NodeRef>
|
||||
+ ParentProviderClojure<NodeRef = Ctx::NodeRef>
|
||||
),
|
||||
grandparent: &mut impl Parent2NodeRelationSetterClojure<NodeRef = Ctx::NodeRef>,
|
||||
parent: Ctx::NodeRef,
|
||||
child: Ctx::NodeRef,
|
||||
) {
|
||||
grandparent.setAsParentOf(child.clone());
|
||||
grandparent.setChild(child.clone());
|
||||
ctx.xSetForwardChild(parent.clone(), ctx.getForwardChild(child.clone()));
|
||||
grandparent.setRelation(child.clone());
|
||||
ctx.xSetForwardRelation(parent.clone(), ctx.getForwardChild(child.clone()));
|
||||
ctx.setForwardRelation(child.clone(), parent.clone());
|
||||
|
||||
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.clone()) {
|
||||
ctx.setParent(n, child.clone())
|
||||
}
|
||||
if let Some(n) = ctx.getOppositeChild(parent.clone()) {
|
||||
ctx.setParent(n, parent.clone())
|
||||
}
|
||||
if let Some(n) = ctx.getForwardChild(child.clone()) {
|
||||
ctx.setParent(n, parent.clone())
|
||||
}
|
||||
ctx.setForwardChild(child.clone(), parent.clone());
|
||||
ctx.setParent(parent, child);
|
||||
ctx.xSetOppositeRelation(parent.clone(), ctx.getOppositeChild(child.clone()));
|
||||
ctx.xSetOppositeRelation(child.clone(), oppositeChild);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user