From e9caf277bf3e77e54c13a5bf8f23b6602b4ab1ec Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Fri, 26 Dec 2025 15:33:28 +0300 Subject: [PATCH] Clojure to pass info about local root's parent --- src/context.rs | 10 ++ src/lib.rs | 1 + src/parent2node/clojure.rs | 18 +++ src/parent2node/fixed_wrapper.rs | 193 +++++++++++++++++++++++++++++++ src/parent2node/mod.rs | 2 + 5 files changed, 224 insertions(+) create mode 100644 src/parent2node/clojure.rs create mode 100644 src/parent2node/fixed_wrapper.rs create mode 100644 src/parent2node/mod.rs diff --git a/src/context.rs b/src/context.rs index 3c71e5b..8d23329 100644 --- a/src/context.rs +++ b/src/context.rs @@ -2,6 +2,16 @@ pub trait NodeRefContainer { type NodeRef: Sized + Copy; } +pub trait BinaryTreeRootGetter: NodeRefContainer { + fn getRoot(&self) -> Option; +} + +pub trait BinaryTreeRootSetter: NodeRefContainer { + fn xSetRoot(&mut self, newRoot: Option); + fn setRoot(&mut self, newRoot: Self::NodeRef); + fn clearRoot(&mut self); +} + pub trait BinaryTreeDownWalker: NodeRefContainer { fn getLeftChild(&self, node: Self::NodeRef) -> Option; fn getRightChild(&self, node: Self::NodeRef) -> Option; diff --git a/src/lib.rs b/src/lib.rs index 12ed672..20430a6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ mod context; mod swap; mod directed; mod direction; +mod parent2node; pub use context::NodeRefContainer; pub use direction::BinaryTreeDirection; \ No newline at end of file diff --git a/src/parent2node/clojure.rs b/src/parent2node/clojure.rs new file mode 100644 index 0000000..eb6eff8 --- /dev/null +++ b/src/parent2node/clojure.rs @@ -0,0 +1,18 @@ +use crate::NodeRefContainer; + +pub trait Parent2NodeGetter: NodeRefContainer { + fn getChild(&self) -> Self::NodeRef; +} + +pub trait Parent2NodeSetter: NodeRefContainer { + fn xSetChild(&mut self, newChild: Option) { + match newChild { + None => self.clearChild(), + Some(nn) => self.setChild(nn), + } + } + + fn setChild(&mut self, newChild: Self::NodeRef); + + fn clearChild(&mut self); +} diff --git a/src/parent2node/fixed_wrapper.rs b/src/parent2node/fixed_wrapper.rs new file mode 100644 index 0000000..5a49d9e --- /dev/null +++ b/src/parent2node/fixed_wrapper.rs @@ -0,0 +1,193 @@ +use crate::NodeRefContainer; +use crate::context::{ + BinaryTreeDownBuilder, BinaryTreeDownWalker, BinaryTreeRootGetter, BinaryTreeRootSetter, +}; +use crate::parent2node::clojure::{Parent2NodeGetter, Parent2NodeSetter}; + +struct Parent2LeftChildContextWrapper { + ctx: CtxRef, + node: NodeRef, +} + +struct Parent2RightChildContextWrapper { + ctx: CtxRef, + node: NodeRef, +} + +struct Root2NodeContextWrapper { + ctx: NodeRef, +} + +impl<'ctx, CtxRef: NodeRefContainer> Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> { + fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> + Parent2LeftChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn wrap(ctx: &'ctx mut CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> + Parent2RightChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> + Parent2RightChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn wrap(ctx: &'ctx mut CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer + BinaryTreeRootGetter> Root2NodeContextWrapper<&'ctx CtxRef> { + fn wrap(ctx: &'ctx CtxRef) -> Self { + return Self { ctx }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> + Root2NodeContextWrapper<&'ctx mut CtxRef> +{ + fn wrap(ctx: &'ctx mut CtxRef) -> Self { + return Self { ctx }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2LeftChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2RightChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2RightChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer for Root2NodeContextWrapper<&'ctx CtxRef> { + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Root2NodeContextWrapper<&'ctx mut CtxRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: BinaryTreeDownWalker> Parent2NodeGetter + for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getLeftChild(self.node); + } +} + +impl<'ctx, CtxRef: BinaryTreeDownWalker> Parent2NodeGetter + for Parent2LeftChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getLeftChild(self.node); + } +} + +impl<'ctx, CtxRef: BinaryTreeDownWalker> Parent2NodeGetter + for Parent2RightChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getRightChild(self.node); + } +} + +impl<'ctx, CtxRef: BinaryTreeDownWalker> Parent2NodeGetter + for Parent2RightChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getRightChild(self.node); + } +} + +impl<'ctx, CtxRef: BinaryTreeRootGetter> Parent2NodeGetter + for Root2NodeContextWrapper<&'ctx CtxRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getRoot(); + } +} + +impl<'ctx, CtxRef: BinaryTreeRootGetter> Parent2NodeGetter + for Root2NodeContextWrapper<&'ctx mut CtxRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getRoot(); + } +} + +impl<'ctx, CtxRef: BinaryTreeDownBuilder> Parent2NodeSetter + for Parent2LeftChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn xSetChild(&mut self, newChild: Option) { + self.ctx.xSetLeftChild(self.node, newChild); + } + + fn setChild(&mut self, newChild: Self::NodeRef) { + self.ctx.setLeftChild(self.node, newChild); + } + + fn clearChild(&mut self) { + self.ctx.clearLeftChild(self.node); + } +} + +impl<'ctx, CtxRef: BinaryTreeDownBuilder> Parent2NodeSetter + for Parent2RightChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn xSetChild(&mut self, newChild: Option) { + self.ctx.xSetRightChild(self.node, newChild); + } + + fn setChild(&mut self, newChild: Self::NodeRef) { + self.ctx.setRightChild(self.node, newChild); + } + + fn clearChild(&mut self) { + self.ctx.clearRightChild(self.node); + } +} + +impl<'ctx, CtxRef: BinaryTreeRootSetter> Parent2NodeSetter + for Root2NodeContextWrapper<&'ctx mut CtxRef> +{ + fn xSetChild(&mut self, newChild: Option) { + self.ctx.xSetRoot(newChild) + } + + fn setChild(&mut self, newChild: Self::NodeRef) { + self.ctx.setRoot(newChild) + } + + fn clearChild(&mut self) { + self.ctx.clearRoot() + } +} diff --git a/src/parent2node/mod.rs b/src/parent2node/mod.rs new file mode 100644 index 0000000..bf1af10 --- /dev/null +++ b/src/parent2node/mod.rs @@ -0,0 +1,2 @@ +mod clojure; +mod fixed_wrapper; \ No newline at end of file