Don't force nodes to store references to other nodes

This commit is contained in:
Dennis
2022-06-05 15:25:07 +02:00
committed by Keavon Chambers
parent fa5345d33f
commit a2703c0fb1
12 changed files with 252 additions and 242 deletions

View File

@@ -4,47 +4,41 @@ use graphene_core::Node;
use dyn_any::{DynAny, StaticType, StaticTypeSized};
pub struct AnyRefNode<'n, N: Node<'n, I, Output = O>, I, O>(
&'n N,
PhantomData<&'n I>,
PhantomData<&'n O>,
);
pub struct AnyRefNode<'n, N: Node<'n>>(N, PhantomData<&'n ()>);
impl<'n, N: Node<'n, I, Output = &'n O>, I, O: DynAny<'n>> Node<'n, I>
for AnyRefNode<'n, N, I, &'n O>
{
impl<'n, N: Node<'n, Output = &'n O>, O: DynAny<'n> + 'n> Node<'n> for AnyRefNode<'n, N> {
type Output = &'n (dyn DynAny<'n>);
fn eval(&'n self, input: I) -> Self::Output {
let value: &O = self.0.eval(input);
fn eval(&'n self) -> Self::Output {
let value: &O = self.0.eval();
value
}
}
impl<'n, N: Node<'n, I, Output = &'n O>, I, O: 'n + ?Sized> AnyRefNode<'n, N, I, &'n O> {
pub fn new(n: &'n N) -> AnyRefNode<'n, N, I, &'n O> {
AnyRefNode(n, PhantomData, PhantomData)
impl<'n, N: Node<'n, Output = &'n O>, O: 'n + ?Sized> AnyRefNode<'n, N> {
pub fn new(n: N) -> AnyRefNode<'n, N> {
AnyRefNode(n, PhantomData)
}
}
pub struct StorageNode<'n>(&'n dyn Node<'n, (), Output = &'n dyn DynAny<'n>>);
pub struct StorageNode<'n>(&'n dyn Node<'n, Output = &'n dyn DynAny<'n>>);
impl<'n> Node<'n, ()> for StorageNode<'n> {
impl<'n> Node<'n> for StorageNode<'n> {
type Output = &'n (dyn DynAny<'n>);
fn eval(&'n self, input: ()) -> Self::Output {
let value = self.0.eval(input);
fn eval(&'n self) -> Self::Output {
let value = self.0.eval();
value
}
}
impl<'n> StorageNode<'n> {
pub fn new<N: Node<'n, (), Output = &'n dyn DynAny<'n>>>(n: &'n N) -> StorageNode<'n> {
pub fn new<N: Node<'n, Output = &'n dyn DynAny<'n>>>(n: &'n N) -> StorageNode<'n> {
StorageNode(n)
}
}
#[derive(Default)]
pub struct AnyValueNode<'n, T>(T, PhantomData<&'n ()>);
impl<'n, T: 'n + DynAny<'n>> Node<'n, ()> for AnyValueNode<'n, T> {
impl<'n, T: 'n + DynAny<'n>> Node<'n> for AnyValueNode<'n, T> {
type Output = &'n dyn DynAny<'n>;
fn eval(&'n self, _input: ()) -> &'n dyn DynAny<'n> {
fn eval(&'n self) -> &'n dyn DynAny<'n> {
&self.0
}
}