mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-22 09:18:11 +08:00
Restructure node graph proxy architecture
This commit is contained in:
+19
-28
@@ -3,6 +3,7 @@ pub mod ops;
|
||||
pub mod structural;
|
||||
pub mod value;
|
||||
|
||||
use dyn_any::{downcast_ref, DynAny, StaticType};
|
||||
use std::any::Any;
|
||||
|
||||
#[rustfmt::skip]
|
||||
@@ -12,42 +13,32 @@ pub trait Node< 'n, Input> {
|
||||
fn eval(&'n self, input: &'n Input) -> Self::Output;
|
||||
}
|
||||
|
||||
pub trait Exec<'n> {
|
||||
type Output: 'n;
|
||||
fn exec(&'n self) -> Self::Output;
|
||||
}
|
||||
impl<'n, T: Exec<'n>> Node<'n, ()> for T {
|
||||
type Output = <Self as Exec<'n>>::Output;
|
||||
fn eval(&'n self, _input: &()) -> Self::Output {
|
||||
self.exec()
|
||||
pub trait Exec<'n>: Node<'n, ()> {
|
||||
fn exec(&'n self) -> Self::Output {
|
||||
self.eval(&())
|
||||
}
|
||||
}
|
||||
impl<'n, T: Node<'n, ()>> Exec<'n> for T {}
|
||||
|
||||
pub trait Cache {
|
||||
fn clear(&mut self);
|
||||
}
|
||||
|
||||
pub type DynNode<'n, T> = &'n (dyn Node<'n, (), Output = T> + 'n);
|
||||
pub type DynAnyNode<'n> = &'n (dyn Node<'n, (), Output = &'n dyn DynAny<'n>> + 'n);
|
||||
|
||||
pub trait DynamicInput<'n> {
|
||||
fn set_kwarg_by_name(
|
||||
&mut self,
|
||||
name: &str,
|
||||
value: &'n dyn Node<'n, (), Output = &'n (dyn Any + 'static)>,
|
||||
);
|
||||
fn set_arg_by_index(
|
||||
&mut self,
|
||||
index: usize,
|
||||
value: &'n dyn Node<'n, (), Output = &'n (dyn Any + 'static)>,
|
||||
);
|
||||
fn set_kwarg_by_name(&mut self, name: &str, value: DynAnyNode<'n>);
|
||||
fn set_arg_by_index(&mut self, index: usize, value: DynAnyNode<'n>);
|
||||
}
|
||||
|
||||
pub trait AnyRef<'n, I>: Node<'n, I> {
|
||||
fn any(&'n self, input: &'n dyn Any) -> Self::Output
|
||||
where
|
||||
I: 'static + Copy;
|
||||
pub trait AnyRef<'n, I: StaticType<'n>>: Node<'n, I> {
|
||||
fn any(&'n self, input: &'n dyn DynAny<'n>) -> Self::Output;
|
||||
}
|
||||
|
||||
impl<'n, T: Node<'n, I>, I> AnyRef<'n, I> for T {
|
||||
fn any(&'n self, input: &'n dyn Any) -> Self::Output
|
||||
where
|
||||
I: 'static + Copy,
|
||||
{
|
||||
self.eval(input.downcast_ref::<I>().unwrap_or_else(|| {
|
||||
impl<'n, T: Node<'n, I>, I: StaticType<'n>> AnyRef<'n, I> for T {
|
||||
fn any(&'n self, input: &'n dyn DynAny<'n>) -> Self::Output {
|
||||
self.eval(downcast_ref::<I>(input).unwrap_or_else(|| {
|
||||
panic!(
|
||||
"Node was evaluated with wrong input. The input has to be of type: {}",
|
||||
std::any::type_name::<I>(),
|
||||
|
||||
Reference in New Issue
Block a user