Stub of swap_context

This commit is contained in:
Andrew Golovashevich 2025-12-29 00:42:52 +03:00
parent f63e012aea
commit 1f14f14e36
3 changed files with 238 additions and 0 deletions

View File

@ -6,3 +6,4 @@ pub mod base_context;
pub mod directed_context;
pub mod parent2node_clojure;
pub mod relation_context;
mod swap_context;

236
src/swap_context/context.rs Normal file
View File

@ -0,0 +1,236 @@
use crate::NodeRefContainer;
use crate::base_context::BinaryTreeDirection;
pub unsafe trait BinaryTreeSwapContext: NodeRefContainer {
fn swapNeighbors(
&mut self,
grandparent: Option<(Self::NodeRef, BinaryTreeDirection)>,
parent: Self::NodeRef,
parent2child: BinaryTreeDirection,
child: Self::NodeRef,
);
fn swapNeighbors_root_dyn(
&mut self,
parent: Self::NodeRef,
parent2child: BinaryTreeDirection,
child: Self::NodeRef,
) {
match parent2child {
BinaryTreeDirection::LEFT => self.swapNeighbors_root_left(parent, child),
BinaryTreeDirection::RIGHT => self.swapNeighbors_root_right(parent, child),
}
}
fn swapNeighbors_left_dyn(
&mut self,
grandparent: Self::NodeRef,
parent: Self::NodeRef,
parent2child: BinaryTreeDirection,
child: Self::NodeRef,
) {
match parent2child {
BinaryTreeDirection::LEFT => self.swapNeighbors_left_left(grandparent, parent, child),
BinaryTreeDirection::RIGHT => self.swapNeighbors_left_right(grandparent, parent, child),
}
}
fn swapNeighbors_right_dyn(
&mut self,
grandparent: Self::NodeRef,
parent: Self::NodeRef,
parent2child: BinaryTreeDirection,
child: Self::NodeRef,
) {
match parent2child {
BinaryTreeDirection::LEFT => self.swapNeighbors_right_left(grandparent, parent, child),
BinaryTreeDirection::RIGHT => {
self.swapNeighbors_right_right(grandparent, parent, child)
}
}
}
fn swapNeighbors_dyn_left(
&mut self,
grandparent: Option<(Self::NodeRef, BinaryTreeDirection)>,
parent: Self::NodeRef,
child: Self::NodeRef,
) {
match grandparent {
None => self.swapNeighbors_root_left(parent, child),
Some((g, BinaryTreeDirection::LEFT)) => self.swapNeighbors_left_left(g, parent, child),
Some((g, BinaryTreeDirection::RIGHT)) => {
self.swapNeighbors_right_left(g, parent, child)
}
}
}
fn swapNeighbors_dyn_right(
&mut self,
grandparent: Option<(Self::NodeRef, BinaryTreeDirection)>,
parent: Self::NodeRef,
child: Self::NodeRef,
) {
match grandparent {
None => self.swapNeighbors_root_right(parent, child),
Some((g, BinaryTreeDirection::LEFT)) => self.swapNeighbors_left_right(g, parent, child),
Some((g, BinaryTreeDirection::RIGHT)) => {
self.swapNeighbors_right_right(g, parent, child)
}
}
}
fn swapNeighbors_root_left(&mut self, parent: Self::NodeRef, child: Self::NodeRef);
fn swapNeighbors_root_right(&mut self, parent: Self::NodeRef, child: Self::NodeRef);
fn swapNeighbors_left_left(
&mut self,
grandparent: Self::NodeRef,
parent: Self::NodeRef,
child: Self::NodeRef,
);
fn swapNeighbors_left_right(
&mut self,
grandparent: Self::NodeRef,
parent: Self::NodeRef,
child: Self::NodeRef,
);
fn swapNeighbors_right_left(
&mut self,
grandparent: Self::NodeRef,
parent: Self::NodeRef,
child: Self::NodeRef,
);
fn swapNeighbors_right_right(
&mut self,
grandparent: Self::NodeRef,
parent: Self::NodeRef,
child: Self::NodeRef,
);
fn swapDistant_dyn_left(
&mut self,
parent1: Option<(Self::NodeRef, BinaryTreeDirection)>,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
) {
match parent1 {
None => self.swapDistant_root_left(node1, parent2, node2),
Some((g, BinaryTreeDirection::LEFT)) => {
self.swapDistant_left_left(g, node1, parent2, node2)
}
Some((g, BinaryTreeDirection::RIGHT)) => {
self.swapDistant_right_left(g, node1, parent2, node2)
}
}
}
fn swapDistant_dyn_right(
&mut self,
parent1: Option<(Self::NodeRef, BinaryTreeDirection)>,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
) {
match parent1 {
None => self.swapDistant_root_right(node1, parent2, node2),
Some((g, BinaryTreeDirection::LEFT)) => {
self.swapDistant_left_right(g, node1, parent2, node2)
}
Some((g, BinaryTreeDirection::RIGHT)) => {
self.swapDistant_right_right(g, node1, parent2, node2)
}
}
}
fn swapDistant_root_dyn(
&mut self,
node1: Self::NodeRef,
parent2: (Self::NodeRef, BinaryTreeDirection),
node2: Self::NodeRef,
) {
match parent2.1 {
BinaryTreeDirection::LEFT => self.swapDistant_root_left(node1, parent2.0, node2),
BinaryTreeDirection::RIGHT => self.swapDistant_root_right(node1, parent2.0, node2),
}
}
fn swapDistant_left_dyn(
&mut self,
parent1: Self::NodeRef,
node1: Self::NodeRef,
parent2: (Self::NodeRef, BinaryTreeDirection),
node2: Self::NodeRef,
) {
match parent2.1 {
BinaryTreeDirection::LEFT => {
self.swapDistant_left_left(parent1, node1, parent2.0, node2)
}
BinaryTreeDirection::RIGHT => {
self.swapDistant_left_right(parent1, node1, parent2.0, node2)
}
}
}
fn swapDistant_right_dyn(
&mut self,
parent1: Self::NodeRef,
node1: Self::NodeRef,
parent2: (Self::NodeRef, BinaryTreeDirection),
node2: Self::NodeRef,
) {
match parent2.1 {
BinaryTreeDirection::LEFT => {
self.swapDistant_right_left(parent1, node1, parent2.0, node2)
}
BinaryTreeDirection::RIGHT => {
self.swapDistant_right_right(parent1, node1, parent2.0, node2)
}
}
}
fn swapDistant_root_left(
&mut self,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
);
fn swapDistant_root_right(
&mut self,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
);
fn swapDistant_left_left(
&mut self,
parent1: Self::NodeRef,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
);
fn swapDistant_left_right(
&mut self,
parent1: Self::NodeRef,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
);
fn swapDistant_right_left(
&mut self,
parent1: Self::NodeRef,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
);
fn swapDistant_right_right(
&mut self,
parent1: Self::NodeRef,
node1: Self::NodeRef,
parent2: Self::NodeRef,
node2: Self::NodeRef,
);
}

1
src/swap_context/mod.rs Normal file
View File

@ -0,0 +1 @@
mod context;