Support for polymorphic access to directed contexts
This commit is contained in:
parent
e9caf277bf
commit
54972e8215
@ -1,2 +1,6 @@
|
|||||||
mod context;
|
mod context;
|
||||||
mod impls;
|
mod impls;
|
||||||
|
|
||||||
|
pub use context::DirectedBinaryTreeBuilder;
|
||||||
|
pub use context::DirectedBinaryTreeDownBuilder;
|
||||||
|
pub use context::DirectedBinaryTreeDownWalker;
|
||||||
|
|||||||
@ -2,3 +2,7 @@ pub enum BinaryTreeDirection {
|
|||||||
LEFT,
|
LEFT,
|
||||||
RIGHT,
|
RIGHT,
|
||||||
}
|
}
|
||||||
|
pub enum DirectedBinaryTreeDirection {
|
||||||
|
FORWARD,
|
||||||
|
OPPOSITE,
|
||||||
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@ use crate::NodeRefContainer;
|
|||||||
use crate::context::{
|
use crate::context::{
|
||||||
BinaryTreeDownBuilder, BinaryTreeDownWalker, BinaryTreeRootGetter, BinaryTreeRootSetter,
|
BinaryTreeDownBuilder, BinaryTreeDownWalker, BinaryTreeRootGetter, BinaryTreeRootSetter,
|
||||||
};
|
};
|
||||||
|
use crate::directed::{DirectedBinaryTreeDownBuilder, DirectedBinaryTreeDownWalker};
|
||||||
use crate::parent2node::clojure::{Parent2NodeGetter, Parent2NodeSetter};
|
use crate::parent2node::clojure::{Parent2NodeGetter, Parent2NodeSetter};
|
||||||
|
|
||||||
struct Parent2LeftChildContextWrapper<CtxRef, NodeRef> {
|
struct Parent2LeftChildContextWrapper<CtxRef, NodeRef> {
|
||||||
@ -18,6 +19,16 @@ struct Root2NodeContextWrapper<NodeRef> {
|
|||||||
ctx: NodeRef,
|
ctx: NodeRef,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Parent2ForwardChildContextWrapper<CtxRef, NodeRef> {
|
||||||
|
ctx: CtxRef,
|
||||||
|
node: NodeRef,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Parent2OppositeChildContextWrapper<CtxRef, NodeRef> {
|
||||||
|
ctx: CtxRef,
|
||||||
|
node: NodeRef,
|
||||||
|
}
|
||||||
|
|
||||||
impl<'ctx, CtxRef: NodeRefContainer> Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> {
|
impl<'ctx, CtxRef: NodeRefContainer> Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> {
|
||||||
fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self {
|
fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self {
|
||||||
return Self { ctx, node };
|
return Self { ctx, node };
|
||||||
@ -54,14 +65,44 @@ impl<'ctx, CtxRef: NodeRefContainer + BinaryTreeRootGetter> Root2NodeContextWrap
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'ctx, CtxRef: NodeRefContainer>
|
impl<'ctx, CtxRef: NodeRefContainer> Root2NodeContextWrapper<&'ctx mut CtxRef> {
|
||||||
Root2NodeContextWrapper<&'ctx mut CtxRef>
|
|
||||||
{
|
|
||||||
fn wrap(ctx: &'ctx mut CtxRef) -> Self {
|
fn wrap(ctx: &'ctx mut CtxRef) -> Self {
|
||||||
return Self { ctx };
|
return Self { ctx };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer>
|
||||||
|
Parent2ForwardChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self {
|
||||||
|
return Self { ctx, node };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer>
|
||||||
|
Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn wrap(ctx: &'ctx mut CtxRef, node: CtxRef::NodeRef) -> Self {
|
||||||
|
return Self { ctx, node };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer>
|
||||||
|
Parent2OppositeChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self {
|
||||||
|
return Self { ctx, node };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer>
|
||||||
|
Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn wrap(ctx: &'ctx mut CtxRef, node: CtxRef::NodeRef) -> Self {
|
||||||
|
return Self { ctx, node };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer
|
impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer
|
||||||
for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
{
|
{
|
||||||
@ -96,6 +137,30 @@ impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer
|
|||||||
type NodeRef = CtxRef::NodeRef;
|
type NodeRef = CtxRef::NodeRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer
|
||||||
|
for Parent2ForwardChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
type NodeRef = CtxRef::NodeRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer
|
||||||
|
for Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
type NodeRef = CtxRef::NodeRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer
|
||||||
|
for Parent2OppositeChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
type NodeRef = CtxRef::NodeRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer
|
||||||
|
for Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
type NodeRef = CtxRef::NodeRef;
|
||||||
|
}
|
||||||
|
|
||||||
impl<'ctx, CtxRef: BinaryTreeDownWalker> Parent2NodeGetter
|
impl<'ctx, CtxRef: BinaryTreeDownWalker> Parent2NodeGetter
|
||||||
for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
{
|
{
|
||||||
@ -144,6 +209,40 @@ impl<'ctx, CtxRef: BinaryTreeRootGetter> Parent2NodeGetter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter
|
||||||
|
for Parent2ForwardChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn getChild(&self) -> Self::NodeRef {
|
||||||
|
return self.ctx.getForwardChild(self.node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter
|
||||||
|
for Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn getChild(&self) -> Self::NodeRef {
|
||||||
|
return self.ctx.getForwardChild(self.node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter
|
||||||
|
for Parent2OppositeChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn getChild(&self) -> Self::NodeRef {
|
||||||
|
return self.ctx.getOppositeChild(self.node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter
|
||||||
|
for Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn getChild(&self) -> Self::NodeRef {
|
||||||
|
return self.ctx.getOppositeChild(self.node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'ctx, CtxRef: BinaryTreeDownBuilder> Parent2NodeSetter
|
impl<'ctx, CtxRef: BinaryTreeDownBuilder> Parent2NodeSetter
|
||||||
for Parent2LeftChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
for Parent2LeftChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
{
|
{
|
||||||
@ -191,3 +290,37 @@ impl<'ctx, CtxRef: BinaryTreeRootSetter> Parent2NodeSetter
|
|||||||
self.ctx.clearRoot()
|
self.ctx.clearRoot()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl<'ctx, CtxRef: DirectedBinaryTreeDownBuilder> Parent2NodeSetter
|
||||||
|
for Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn xSetChild(&mut self, newChild: Option<Self::NodeRef>) {
|
||||||
|
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: DirectedBinaryTreeDownBuilder> Parent2NodeSetter
|
||||||
|
for Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef>
|
||||||
|
{
|
||||||
|
fn xSetChild(&mut self, newChild: Option<Self::NodeRef>) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user