Imported neighbor-swap function
This commit is contained in:
parent
db38b824d8
commit
6855724041
@ -1,6 +1,7 @@
|
||||
[package]
|
||||
name = "binary-tree-utilities"
|
||||
name = "binary-tree-utilities-0"
|
||||
version = "0.0.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
[lints]
|
||||
rust = { nonstandard_style = "allow" }
|
||||
11
src/context.rs
Normal file
11
src/context.rs
Normal file
@ -0,0 +1,11 @@
|
||||
pub unsafe trait BinTreeContext {
|
||||
type NodeRef: Sized;
|
||||
|
||||
fn getParent(&self, node: Self::NodeRef) -> Option<Self::NodeRef>;
|
||||
fn getLeftChild(&self, node: Self::NodeRef) -> Option<Self::NodeRef>;
|
||||
fn getRightChild(&self, node: Self::NodeRef) -> Option<Self::NodeRef>;
|
||||
|
||||
fn setParent(&mut self, node: Self::NodeRef, newParent: Option<Self::NodeRef>);
|
||||
fn setLeftChild(&mut self, node: Self::NodeRef, newChild: Option<Self::NodeRef>);
|
||||
fn setRightChild(&mut self, node: Self::NodeRef, newChild: Option<Self::NodeRef>);
|
||||
}
|
||||
@ -0,0 +1,2 @@
|
||||
mod context;
|
||||
mod swap;
|
||||
1
src/swap/mod.rs
Normal file
1
src/swap/mod.rs
Normal file
@ -0,0 +1 @@
|
||||
mod neighbors;
|
||||
25
src/swap/neighbors/context.rs
Normal file
25
src/swap/neighbors/context.rs
Normal file
@ -0,0 +1,25 @@
|
||||
pub trait OrientedNeighborSwapContext {
|
||||
type NodeRef: Sized + Copy;
|
||||
|
||||
fn getParent(&self, node: Self::NodeRef) -> Option<Self::NodeRef>;
|
||||
fn getForwardChild(&self, node: Self::NodeRef) -> Option<Self::NodeRef>;
|
||||
fn getOppositeChild(&self, node: Self::NodeRef) -> Option<Self::NodeRef>;
|
||||
|
||||
fn setParent(&mut self, node: Self::NodeRef, newParent: Option<Self::NodeRef>);
|
||||
fn setForwardChild(&mut self, node: Self::NodeRef, newChild: Option<Self::NodeRef>);
|
||||
fn setOppositeChild(&mut self, node: Self::NodeRef, newChild: Option<Self::NodeRef>);
|
||||
|
||||
fn setGrandparentToParent(&mut self, newParent: Self::NodeRef);
|
||||
}
|
||||
|
||||
pub trait NeighbourSwapSupport {
|
||||
fn leftChild_unknownParent(&self) -> impl OrientedNeighborSwapContext;
|
||||
fn leftChild_root(&self) -> impl OrientedNeighborSwapContext;
|
||||
fn leftChild_grandparentToLeft(&self) -> impl OrientedNeighborSwapContext;
|
||||
fn leftChild_grandparentToRight(&self) -> impl OrientedNeighborSwapContext;
|
||||
|
||||
fn rightChild_unknownParent(&self) -> impl OrientedNeighborSwapContext;
|
||||
fn rightChild_root(&self) -> impl OrientedNeighborSwapContext;
|
||||
fn rightChild_grandparentToLeft(&self) -> impl OrientedNeighborSwapContext;
|
||||
fn rightChild_grandparentToRight(&self) -> impl OrientedNeighborSwapContext;
|
||||
}
|
||||
33
src/swap/neighbors/mod.rs
Normal file
33
src/swap/neighbors/mod.rs
Normal file
@ -0,0 +1,33 @@
|
||||
use crate::swap::neighbors::context::OrientedNeighborSwapContext;
|
||||
|
||||
mod context;
|
||||
mod context_impl;
|
||||
|
||||
|
||||
|
||||
fn swapNeighbors<Context: OrientedNeighborSwapContext>(
|
||||
ctx: &mut Context,
|
||||
grandparent: Option<Context::NodeRef>,
|
||||
parent: Context::NodeRef,
|
||||
child: Context::NodeRef,
|
||||
) {
|
||||
ctx.setParent(child, grandparent);
|
||||
ctx.setGrandparentToParent(child);
|
||||
ctx.setForwardChild(parent, ctx.getForwardChild(child));
|
||||
|
||||
let oppositeChild = ctx.getOppositeChild(parent);
|
||||
ctx.setOppositeChild(parent, ctx.getOppositeChild(child));
|
||||
ctx.setOppositeChild(child, oppositeChild);
|
||||
|
||||
if let Some(n) = ctx.getOppositeChild(child) {
|
||||
ctx.setParent(n, Some(child))
|
||||
}
|
||||
if let Some(n) = ctx.getOppositeChild(parent) {
|
||||
ctx.setParent(n, Some(parent))
|
||||
}
|
||||
if let Some(n) = ctx.getForwardChild(child) {
|
||||
ctx.setParent(n, Some(parent))
|
||||
}
|
||||
ctx.setForwardChild(child, Some(parent));
|
||||
ctx.setParent(parent, Some(child));
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user