mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-18 07:48:02 +08:00
* Generate stable node ids * checkpoint * Implement borrow tree * Add eval function on borrow tree * Refactor Node trait to fix lifetime issues * Compiler infinite loop * Impl compose pair * Transition to double lifetime on trait * Change node trait to use a generic arg for the input * Start adapting node_macro * Migrate more nodes to new macro * Fix raster tests * Port vector nodes * Make Node trait object safe * Fix FlatMapResultNode * Translate most of gstd * Fix DowncastBothNode * Refactor node trait once again to allow for HRTB for type erased nodes * Start working on type erased nodes * Try getting DowncastBothNode to work * Introduce Upcasting node + work on BorrowTree * Make enough 'static to get the code to compile * Transition DynamicExecutor to use borrow tree * Make Compose Node use HRTB's * Fix MapResultNode * Disable blur test * Add workaround for Composing type erased nodes * Convert more nodes in the node_registry * Convert more of the node_registry * Add update tree fn and hook up to frontend * Fix blur node * Implement CacheNode * Make frontend use graph compiler * Fix document_node_types type declaration for most nodes * Remove unused imports * Move comment down * Reuse nodes via borrow tree * Deprecate trait based value in favor of TaggedValue * Remove unsafe code in buffer creation * Fix blur node * Fix stable node id generation * Fix types for Image adjustment document nodes * Fix Imaginate Node * Remove unused imports * Remove log * Fix off by one error * Remove macro generated imaginate node entry * Create parameterized add node * Fix test case * Remove link from layer_panel.rs * Fix formatting
24 lines
500 B
Rust
24 lines
500 B
Rust
use graphene_core::Node;
|
|
use once_cell::sync::OnceCell;
|
|
|
|
/// Caches the output of a given Node and acts as a proxy
|
|
#[derive(Default)]
|
|
pub struct CacheNode<T> {
|
|
cache: OnceCell<T>,
|
|
}
|
|
impl<'i, T: 'i> Node<'i, T> for CacheNode<T> {
|
|
type Output = &'i T;
|
|
fn eval<'s: 'i>(&'s self, input: T) -> Self::Output {
|
|
self.cache.get_or_init(|| {
|
|
trace!("Creating new cache node");
|
|
input
|
|
})
|
|
}
|
|
}
|
|
|
|
impl<T> CacheNode<T> {
|
|
pub const fn new() -> CacheNode<T> {
|
|
CacheNode { cache: OnceCell::new() }
|
|
}
|
|
}
|