From 03b6925b0c14a2d5583576e42839c01218261800 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Mon, 29 Dec 2025 00:48:09 +0300 Subject: [PATCH] Simplified swaps with relation setter contexts --- src/algo/swap/distant.rs | 74 ++++++++++++-------------------------- src/algo/swap/neighbors.rs | 38 +++++--------------- 2 files changed, 32 insertions(+), 80 deletions(-) diff --git a/src/algo/swap/distant.rs b/src/algo/swap/distant.rs index 17a06eb..3a3f280 100644 --- a/src/algo/swap/distant.rs +++ b/src/algo/swap/distant.rs @@ -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 - + ParentProviderClojure - ), + parent1: &mut impl Parent2NodeRelationSetterClojure, node1: Ctx::NodeRef, - parent2: &mut ( - impl Parent2NodeSetterClojure - + ParentProviderClojure - ), + parent2: &mut impl Parent2NodeRelationSetterClojure, 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 - + ParentProviderClojure - ), + parent1: &mut impl Parent2NodeRelationSetterClojure, node1: Ctx::NodeRef, - parent2: &mut ( - impl Parent2NodeSetterClojure - + ParentProviderClojure - ), + parent2: &mut impl Parent2NodeRelationSetterClojure, 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); } } diff --git a/src/algo/swap/neighbors.rs b/src/algo/swap/neighbors.rs index 3fc32b9..4f80b6c 100644 --- a/src/algo/swap/neighbors.rs +++ b/src/algo/swap/neighbors.rs @@ -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 - + ParentProviderClojure - ), + grandparent: &mut impl Parent2NodeRelationSetterClojure, 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); }