From 998f37d1b01b60ea59f2394040929c8166b14157 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sun, 5 Jun 2022 22:58:12 +0200 Subject: [PATCH] Add Unit and Id nodes to node graph --- node-graph/gcore/src/generic.rs | 8 +++++--- node-graph/gcore/src/ops.rs | 30 +++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/node-graph/gcore/src/generic.rs b/node-graph/gcore/src/generic.rs index 72772dea..08279ddf 100644 --- a/node-graph/gcore/src/generic.rs +++ b/node-graph/gcore/src/generic.rs @@ -22,12 +22,12 @@ impl<'n, T: Fn(>::Output) -> O, N: Node<'n>, O> FnNode<'n, T, N, O pub struct FnNodeWithState< 'n, - T: Fn(>::Output, &State) -> O, + T: Fn(>::Output, &'n State) -> O, N: Node<'n>, O, State: 'n, >(T, N, State, PhantomData<&'n O>); -impl<'n, T: Fn(>::Output, &State) -> O, N: Node<'n>, O: 'n, State> Node<'n> +impl<'n, T: Fn(>::Output, &'n State) -> O, N: Node<'n>, O: 'n, State: 'n> Node<'n> for FnNodeWithState<'n, T, N, O, State> { type Output = O; @@ -37,7 +37,9 @@ impl<'n, T: Fn(>::Output, &State) -> O, N: Node<'n>, O: 'n, State> } } -impl<'n, T: Fn(N::Output, &State) -> O, N: Node<'n>, O, State> FnNodeWithState<'n, T, N, O, State> { +impl<'n, T: Fn(>::Output, &'n State) -> O, N: Node<'n>, O: 'n, State: 'n> + FnNodeWithState<'n, T, N, O, State> +{ pub fn new(f: T, input: N, state: State) -> Self { FnNodeWithState(f, input, state, PhantomData) } diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index 4045921d..ace01f8a 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -48,7 +48,7 @@ impl<'n, T, U: 'n, N: Node<'n, Output = (T, U)>> Node<'n> for SndNode<'n, N> { } #[repr(C)] -/// Destructures a Tuple of two values and returns the first one +/// Return a tuple with two instances of the input argument pub struct DupNode<'n, N: Node<'n>>(N, PhantomData<&'n ()>); impl<'n, N: Node<'n>> Node<'n> for DupNode<'n, N> { type Output = (N::Output, N::Output); @@ -57,15 +57,39 @@ impl<'n, N: Node<'n>> Node<'n> for DupNode<'n, N> { } } +#[repr(C)] +/// Return the unit value +pub struct UnitNode; +impl<'n> Node<'n> for UnitNode { + type Output = (); + fn eval(&'n self) -> Self::Output {} +} + +#[repr(C)] +/// Return the Input Argument +pub struct IdNode<'n, N: Node<'n>>(N, PhantomData<&'n ()>); +impl<'n, N: Node<'n>> Node<'n> for IdNode<'n, N> { + type Output = N::Output; + fn eval(&'n self) -> Self::Output { + self.0.eval() + } +} + pub fn foo() { - let value = crate::value::ValueNode::new(2u32); + let unit = UnitNode; + let value = IdNode(crate::value::ValueNode::new(2u32), PhantomData); let value2 = crate::value::ValueNode::new(4u32); - let dup = DupNode(value, PhantomData); + let dup = DupNode(&value, PhantomData); + fn int(_: (), state: &u32) -> &u32 { + state + } fn swap<'n>(input: (&'n u32, &'n u32)) -> (&'n u32, &'n u32) { (input.1, input.0) } let fnn = crate::generic::FnNode::new(swap, &dup); + let fns = crate::generic::FnNodeWithState::new(int, &unit, 42u32); let _ = fnn.eval(); + let _ = fns.eval(); let snd = SndNode(&fnn, PhantomData); let _ = snd.eval(); let add = AddNode(&snd, value2, PhantomData);