mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-15 22:28:10 +08:00
Prep gcore splitup 2: Vector extension traits (#2759)
* extension trait for `MergeByDistance::merge_by_distance_*` * extension trait for `VectorData::append_bezpath` * extension trait for `HandleId::set_relative_position` * remove unreferenced rust files
This commit is contained in:
@@ -1,51 +0,0 @@
|
||||
use parking_lot::RawRwLock;
|
||||
use std::any::Any;
|
||||
use std::borrow::Borrow;
|
||||
use std::cell::RefCell;
|
||||
use std::collections::hash_map::DefaultHasher;
|
||||
use std::collections::HashMap;
|
||||
use std::hash::{Hash, Hasher};
|
||||
use std::iter::{self, Sum};
|
||||
use std::marker::PhantomData;
|
||||
use storage_map::{StorageMap, StorageMapGuard};
|
||||
|
||||
/// Caches the output of a given Node and acts as a proxy
|
||||
/// Automatically resets if it receives different input
|
||||
pub struct SmartCacheNode<'n, 'c, NODE: Node + 'c> {
|
||||
node: &'n NODE,
|
||||
map: StorageMap<RawRwLock, HashMap<u64, CacheNode<'n, 'c, NODE>>>,
|
||||
}
|
||||
impl<'n: 'c, 'c, NODE: Node + 'c> Node for SmartCacheNode<'n, 'c, NODE>
|
||||
where
|
||||
for<'a> NODE::Input<'a>: Hash,
|
||||
{
|
||||
type Input<'a>
|
||||
= NODE::Input<'a>
|
||||
where
|
||||
Self: 'a,
|
||||
'c: 'a;
|
||||
type Output<'a>
|
||||
= StorageMapGuard<'a, RawRwLock, CacheNode<'n, 'c, NODE>>
|
||||
where
|
||||
Self: 'a,
|
||||
'c: 'a;
|
||||
fn eval<'a, I: Borrow<Self::Input<'a>>>(&'a self, input: I) -> Self::Output<'a> {
|
||||
let mut hasher = DefaultHasher::new();
|
||||
input.borrow().hash(&mut hasher);
|
||||
let hash = hasher.finish();
|
||||
|
||||
self.map.get_or_create_with(&hash, || {
|
||||
trace!("Creating new cache node");
|
||||
CacheNode::new(self.node)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl<'n, 'c, NODE: Node> SmartCacheNode<'n, 'c, NODE> {
|
||||
pub fn clear(&'n mut self) {
|
||||
self.map = StorageMap::default();
|
||||
}
|
||||
pub fn new(node: &'n NODE) -> SmartCacheNode<'n, 'c, NODE> {
|
||||
SmartCacheNode { node, map: StorageMap::default() }
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
use core::marker::PhantomData;
|
||||
pub use graphene_core::value::*;
|
||||
use graphene_core::Node;
|
||||
use dyn_any::DynAny;
|
||||
|
||||
pub struct AnyRefNode<'n, N: Node<'n>>(N, PhantomData<&'n ()>);
|
||||
|
||||
impl<'n, N: Node<'n, Output = &'n O>, O: DynAny<'n> + 'n> Node<'n> for AnyRefNode<'n, N> {
|
||||
fn eval(&'n self) -> &'n (dyn DynAny<'n>) {
|
||||
let value: &O = self.0.eval();
|
||||
value
|
||||
}
|
||||
}
|
||||
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>>);
|
||||
|
||||
impl<'n> Node<'n> for StorageNode<'n> {
|
||||
fn eval(&'n self) -> &'n (dyn DynAny<'n>) {
|
||||
self.0.eval()
|
||||
}
|
||||
}
|
||||
impl<'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> {
|
||||
fn eval(&'n self) -> &'n dyn DynAny<'n> {
|
||||
&self.0
|
||||
}
|
||||
}
|
||||
|
||||
impl<'n, T> AnyValueNode<'n, T> {
|
||||
pub const fn new(value: T) -> AnyValueNode<'n, T> {
|
||||
AnyValueNode(value, PhantomData)
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
use bezier_rs::{ManipulatorGroup, Subpath};
|
||||
use glam::{DAffine2, DVec2};
|
||||
use graphene_core::instances::{Instance, InstanceRef};
|
||||
use graphene_core::vector::algorithms::merge_by_distance::MergeByDistanceExt;
|
||||
use graphene_core::vector::misc::BooleanOperation;
|
||||
use graphene_core::vector::style::Fill;
|
||||
pub use graphene_core::vector::*;
|
||||
|
||||
Reference in New Issue
Block a user