passes.rs 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. use anymap::AnyMap;
  2. use core::panic;
  3. use parking_lot::RwLock;
  4. use rustc_hash::{FxHashMap, FxHashSet};
  5. use std::any::{Any, TypeId};
  6. use std::collections::BTreeMap;
  7. use std::marker::PhantomData;
  8. use std::sync::Arc;
  9. use crate::node::{FromAnyValue, NodeData};
  10. use crate::node_ref::{NodeMaskBuilder, NodeView};
  11. use crate::real_dom::RealDom;
  12. use crate::tree::{SlabEntry, Tree, TreeStateView};
  13. use crate::{FxDashSet, SendAnyMap};
  14. use crate::{NodeId, NodeMask};
  15. #[derive(Default)]
  16. struct DirtyNodes {
  17. passes_dirty: Vec<u64>,
  18. }
  19. impl DirtyNodes {
  20. pub fn add_node(&mut self, node_id: NodeId) {
  21. let node_id = node_id.0;
  22. let index = node_id / 64;
  23. let bit = node_id % 64;
  24. let encoded = 1 << bit;
  25. if let Some(passes) = self.passes_dirty.get_mut(index) {
  26. *passes |= encoded;
  27. } else {
  28. self.passes_dirty.resize(index + 1, 0);
  29. self.passes_dirty[index] |= encoded;
  30. }
  31. }
  32. pub fn is_empty(&self) -> bool {
  33. self.passes_dirty.iter().all(|dirty| *dirty == 0)
  34. }
  35. pub fn pop(&mut self) -> Option<NodeId> {
  36. let index = self.passes_dirty.iter().position(|dirty| *dirty != 0)?;
  37. let passes = self.passes_dirty[index];
  38. let node_id = passes.trailing_zeros();
  39. let encoded = 1 << node_id;
  40. self.passes_dirty[index] &= !encoded;
  41. Some(NodeId((index * 64) + node_id as usize))
  42. }
  43. }
  44. #[derive(Clone)]
  45. pub struct DirtyNodeStates {
  46. dirty: Arc<FxHashMap<TypeId, RwLock<BTreeMap<u16, DirtyNodes>>>>,
  47. }
  48. impl DirtyNodeStates {
  49. pub fn with_passes(passes: impl Iterator<Item = TypeId>) -> Self {
  50. let mut dirty = FxHashMap::default();
  51. for pass in passes {
  52. dirty.insert(pass, RwLock::new(BTreeMap::new()));
  53. }
  54. Self {
  55. dirty: Arc::new(dirty),
  56. }
  57. }
  58. pub fn insert(&self, pass_id: TypeId, node_id: NodeId, height: u16) {
  59. let btree = self.dirty.get(&pass_id).unwrap();
  60. let mut write = btree.write();
  61. if let Some(entry) = write.get_mut(&height) {
  62. entry.add_node(node_id);
  63. } else {
  64. let mut entry = DirtyNodes::default();
  65. entry.add_node(node_id);
  66. write.insert(height, entry);
  67. }
  68. }
  69. fn pop_front(&self, pass_id: TypeId) -> Option<(u16, NodeId)> {
  70. let mut values = self.dirty.get(&pass_id)?.write();
  71. let mut value = values.first_entry()?;
  72. let height = *value.key();
  73. let ids = value.get_mut();
  74. let id = ids.pop()?;
  75. if ids.is_empty() {
  76. value.remove_entry();
  77. }
  78. Some((height, id))
  79. }
  80. fn pop_back(&self, pass_id: TypeId) -> Option<(u16, NodeId)> {
  81. let mut values = self.dirty.get(&pass_id)?.write();
  82. let mut value = values.last_entry()?;
  83. let height = *value.key();
  84. let ids = value.get_mut();
  85. let id = ids.pop()?;
  86. if ids.is_empty() {
  87. value.remove_entry();
  88. }
  89. Some((height, id))
  90. }
  91. }
  92. pub trait Pass<V: FromAnyValue + Send + Sync = ()>: Any + Send + Sync {
  93. /// This is a tuple of (T: Any, ..)
  94. type ParentDependencies: Dependancy;
  95. /// This is a tuple of (T: Any, ..)
  96. type ChildDependencies: Dependancy;
  97. /// This is a tuple of (T: Any, ..)
  98. type NodeDependencies: Dependancy;
  99. const NODE_MASK: NodeMaskBuilder;
  100. fn pass<'a>(
  101. &mut self,
  102. node_view: NodeView<V>,
  103. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  104. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  105. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  106. context: &SendAnyMap,
  107. ) -> bool;
  108. fn create<'a>(
  109. node_view: NodeView<V>,
  110. node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  111. parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  112. children: Option<Vec<<Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>>,
  113. context: &SendAnyMap,
  114. ) -> Self;
  115. fn validate() {
  116. // no type can be a child and parent dependency
  117. for type_id in Self::parent_type_ids().iter().copied() {
  118. for type_id2 in Self::child_type_ids().iter().copied() {
  119. if type_id == type_id2 {
  120. panic!("type cannot be both a parent and child dependency");
  121. }
  122. }
  123. }
  124. // this type should not be a node dependency
  125. for type_id in Self::node_type_ids().iter().copied() {
  126. if type_id == TypeId::of::<Self>() {
  127. panic!("The current type cannot be a node dependency");
  128. }
  129. }
  130. // no states have the same type id
  131. if Self::all_dependanices()
  132. .iter()
  133. .collect::<FxDashSet<_>>()
  134. .len()
  135. != Self::all_dependanices().len()
  136. {
  137. panic!("all states must have unique type ids");
  138. }
  139. }
  140. fn to_type_erased() -> TypeErasedPass<V>
  141. where
  142. Self: Sized,
  143. {
  144. Self::validate();
  145. let node_mask = Self::NODE_MASK.build();
  146. TypeErasedPass {
  147. this_type_id: TypeId::of::<Self>(),
  148. combined_dependancy_type_ids: Self::all_dependanices().iter().copied().collect(),
  149. parent_dependant: !Self::parent_type_ids().is_empty(),
  150. child_dependant: !Self::child_type_ids().is_empty(),
  151. dependants: FxHashSet::default(),
  152. mask: node_mask.clone(),
  153. pass_direction: Self::pass_direction(),
  154. pass: Box::new(
  155. move |node_id: NodeId, tree: &mut TreeStateView, context: &SendAnyMap| {
  156. debug_assert!(!Self::NodeDependencies::type_ids()
  157. .iter()
  158. .any(|id| *id == TypeId::of::<Self>()));
  159. // get all of the states from the tree view
  160. // Safety: No node has itself as a parent or child.
  161. let myself: SlabEntry<'static, Self> = unsafe {
  162. std::mem::transmute(tree.get_slab_mut::<Self>().unwrap().entry(node_id))
  163. };
  164. let node_data = tree.get_single::<NodeData<V>>(node_id).unwrap();
  165. let node = tree.get::<Self::NodeDependencies>(node_id).unwrap();
  166. let children = tree.children::<Self::ChildDependencies>(node_id);
  167. let parent = tree.parent::<Self::ParentDependencies>(node_id);
  168. if myself.value.is_none() {
  169. *myself.value = Some(Self::create(
  170. NodeView::new(node_data, &node_mask),
  171. node,
  172. parent,
  173. children,
  174. context,
  175. ));
  176. true
  177. } else {
  178. myself.value.as_mut().unwrap().pass(
  179. NodeView::new(node_data, &node_mask),
  180. node,
  181. parent,
  182. children,
  183. context,
  184. )
  185. }
  186. },
  187. ) as PassCallback,
  188. create: Box::new(|tree: &mut Tree| tree.insert_slab::<Self>()) as CreatePassCallback,
  189. phantom: PhantomData,
  190. }
  191. }
  192. fn parent_type_ids() -> Box<[TypeId]> {
  193. Self::ParentDependencies::type_ids()
  194. }
  195. fn child_type_ids() -> Box<[TypeId]> {
  196. Self::ChildDependencies::type_ids()
  197. }
  198. fn node_type_ids() -> Box<[TypeId]> {
  199. Self::NodeDependencies::type_ids()
  200. }
  201. fn all_dependanices() -> Box<[TypeId]> {
  202. let mut dependencies = Self::parent_type_ids().to_vec();
  203. dependencies.extend(Self::child_type_ids().iter());
  204. dependencies.extend(Self::node_type_ids().iter());
  205. dependencies.into_boxed_slice()
  206. }
  207. fn pass_direction() -> PassDirection {
  208. if Self::child_type_ids()
  209. .iter()
  210. .any(|type_id| *type_id == TypeId::of::<Self>())
  211. {
  212. PassDirection::ChildToParent
  213. } else if Self::parent_type_ids()
  214. .iter()
  215. .any(|type_id| *type_id == TypeId::of::<Self>())
  216. {
  217. PassDirection::ParentToChild
  218. } else {
  219. PassDirection::AnyOrder
  220. }
  221. }
  222. }
  223. pub struct TypeErasedPass<V: FromAnyValue + Send = ()> {
  224. pub(crate) this_type_id: TypeId,
  225. pub(crate) parent_dependant: bool,
  226. pub(crate) child_dependant: bool,
  227. pub(crate) combined_dependancy_type_ids: FxHashSet<TypeId>,
  228. pub(crate) dependants: FxHashSet<TypeId>,
  229. pub(crate) mask: NodeMask,
  230. pass: PassCallback,
  231. pub(crate) create: CreatePassCallback,
  232. pub(crate) pass_direction: PassDirection,
  233. phantom: PhantomData<V>,
  234. }
  235. impl<V: FromAnyValue + Send> TypeErasedPass<V> {
  236. fn resolve(
  237. &self,
  238. mut tree: TreeStateView,
  239. dirty: &DirtyNodeStates,
  240. nodes_updated: &FxDashSet<NodeId>,
  241. ctx: &SendAnyMap,
  242. ) {
  243. match self.pass_direction {
  244. PassDirection::ParentToChild => {
  245. while let Some((height, id)) = dirty.pop_front(self.this_type_id) {
  246. if (self.pass)(id, &mut tree, ctx) {
  247. nodes_updated.insert(id);
  248. for id in tree.children_ids(id).unwrap() {
  249. for dependant in &self.dependants {
  250. dirty.insert(*dependant, *id, height + 1);
  251. }
  252. }
  253. }
  254. }
  255. }
  256. PassDirection::ChildToParent => {
  257. while let Some((height, id)) = dirty.pop_back(self.this_type_id) {
  258. if (self.pass)(id, &mut tree, ctx) {
  259. nodes_updated.insert(id);
  260. if let Some(id) = tree.parent_id(id) {
  261. for dependant in &self.dependants {
  262. dirty.insert(*dependant, id, height - 1);
  263. }
  264. }
  265. }
  266. }
  267. }
  268. PassDirection::AnyOrder => {
  269. while let Some((height, id)) = dirty.pop_back(self.this_type_id) {
  270. if (self.pass)(id, &mut tree, ctx) {
  271. nodes_updated.insert(id);
  272. for dependant in &self.dependants {
  273. dirty.insert(*dependant, id, height);
  274. }
  275. }
  276. }
  277. }
  278. }
  279. }
  280. }
  281. #[derive(Debug)]
  282. pub enum PassDirection {
  283. ParentToChild,
  284. ChildToParent,
  285. AnyOrder,
  286. }
  287. type PassCallback = Box<dyn Fn(NodeId, &mut TreeStateView, &SendAnyMap) -> bool + Send + Sync>;
  288. type CreatePassCallback = Box<dyn Fn(&mut Tree) + Send + Sync>;
  289. pub trait AnyMapLike<'a> {
  290. fn get<T: Any + Sync + Send>(self) -> Option<&'a T>;
  291. }
  292. impl<'a> AnyMapLike<'a> for &'a AnyMap {
  293. fn get<T: Any + Sync + Send>(self) -> Option<&'a T> {
  294. self.get()
  295. }
  296. }
  297. impl<'a> AnyMapLike<'a> for &'a SendAnyMap {
  298. fn get<T: Any + Sync + Send>(self) -> Option<&'a T> {
  299. todo!()
  300. }
  301. }
  302. pub trait Dependancy {
  303. type ElementBorrowed<'a>
  304. where
  305. Self: 'a;
  306. fn borrow_elements_from<'a, T: AnyMapLike<'a> + Copy>(
  307. map: T,
  308. ) -> Option<Self::ElementBorrowed<'a>>;
  309. fn type_ids() -> Box<[TypeId]>;
  310. }
  311. macro_rules! impl_dependancy {
  312. ($($t:ident),*) => {
  313. impl< $($t: Any + Send + Sync),* > Dependancy for ($($t,)*) {
  314. type ElementBorrowed<'a> = ($(&'a $t,)*) where Self: 'a;
  315. #[allow(unused_variables, clippy::unused_unit, non_snake_case)]
  316. fn borrow_elements_from<'a, T: AnyMapLike<'a> + Copy>(map: T) -> Option<Self::ElementBorrowed<'a>> {
  317. Some(($(map.get::<$t>()?,)*))
  318. }
  319. fn type_ids() -> Box<[TypeId]> {
  320. Box::new([$(TypeId::of::<$t>()),*])
  321. }
  322. }
  323. };
  324. }
  325. impl_dependancy!();
  326. impl_dependancy!(A);
  327. impl_dependancy!(A, B);
  328. impl_dependancy!(A, B, C);
  329. impl_dependancy!(A, B, C, D);
  330. impl_dependancy!(A, B, C, D, E);
  331. impl_dependancy!(A, B, C, D, E, F);
  332. impl_dependancy!(A, B, C, D, E, F, G);
  333. impl_dependancy!(A, B, C, D, E, F, G, H);
  334. impl_dependancy!(A, B, C, D, E, F, G, H, I);
  335. impl_dependancy!(A, B, C, D, E, F, G, H, I, J);
  336. impl_dependancy!(A, B, C, D, E, F, G, H, I, J, K);
  337. impl_dependancy!(A, B, C, D, E, F, G, H, I, J, K, L);
  338. impl_dependancy!(A, B, C, D, E, F, G, H, I, J, K, L, M);
  339. impl_dependancy!(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
  340. impl_dependancy!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
  341. impl_dependancy!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
  342. pub fn resolve_passes<V: FromAnyValue + Send + Sync>(
  343. tree: &mut RealDom<V>,
  344. dirty_nodes: DirtyNodeStates,
  345. ctx: SendAnyMap,
  346. parallel: bool,
  347. ) -> FxDashSet<NodeId> {
  348. let passes = &tree.passes;
  349. let mut resolved_passes: FxHashSet<TypeId> = FxHashSet::default();
  350. let mut resolving = Vec::new();
  351. let nodes_updated = Arc::new(FxDashSet::default());
  352. let ctx = Arc::new(ctx);
  353. let mut pass_indexes_remaining: Vec<_> = (0..passes.len()).collect::<Vec<_>>();
  354. while !pass_indexes_remaining.is_empty() {
  355. let mut currently_in_use = FxHashSet::<TypeId>::default();
  356. let dynamically_borrowed_tree = tree.tree.dynamically_borrowed();
  357. rayon::in_place_scope(|s| {
  358. let mut i = 0;
  359. while i < pass_indexes_remaining.len() {
  360. let passes_idx = pass_indexes_remaining[i];
  361. let pass = &passes[passes_idx];
  362. let pass_id = pass.this_type_id;
  363. // check if the pass is ready to be run
  364. if pass.combined_dependancy_type_ids.iter().all(|d| {
  365. (resolved_passes.contains(d) || *d == pass_id) && !currently_in_use.contains(d)
  366. }) {
  367. pass_indexes_remaining.remove(i);
  368. resolving.push(pass_id);
  369. currently_in_use.insert(pass.this_type_id);
  370. let tree_view = dynamically_borrowed_tree.view(
  371. pass.combined_dependancy_type_ids
  372. .iter()
  373. .filter(|id| **id != pass.this_type_id)
  374. .copied()
  375. .chain(std::iter::once(TypeId::of::<NodeData<V>>())),
  376. [pass.this_type_id],
  377. );
  378. let dirty_nodes = dirty_nodes.clone();
  379. let nodes_updated = nodes_updated.clone();
  380. let ctx = ctx.clone();
  381. if parallel {
  382. s.spawn(move |_| {
  383. pass.resolve(tree_view, &dirty_nodes, &nodes_updated, &ctx);
  384. });
  385. } else {
  386. pass.resolve(tree_view, &dirty_nodes, &nodes_updated, &ctx);
  387. }
  388. } else {
  389. i += 1;
  390. }
  391. }
  392. });
  393. resolved_passes.extend(resolving.iter().copied());
  394. resolving.clear()
  395. }
  396. std::sync::Arc::try_unwrap(nodes_updated).unwrap()
  397. }
  398. // #[test]
  399. // fn node_pass() {
  400. // use crate::real_dom::RealDom;
  401. // use crate::tree::{Tree, TreeLike};
  402. // #[derive(Debug, Default, Clone, PartialEq)]
  403. // struct Number(i32);
  404. // impl State for Number {
  405. // fn create_passes() -> Box<[TypeErasedPass<Self>]> {
  406. // Box::new([Number::to_type_erased()])
  407. // }
  408. // }
  409. // impl AnyMapLike for Number {
  410. // fn get<T: Any+Sync+Send>(&self) -> Option<&T> {
  411. // if TypeId::of::<Self>() == TypeId::of::<T>() {
  412. // Some(unsafe { &*(self as *const Self as *const T) })
  413. // } else {
  414. // None
  415. // }
  416. // }
  417. // fn get_mut<T: Any+Sync+Send>(&mut self) -> Option<&mut T> {
  418. // if TypeId::of::<Self>() == TypeId::of::<T>() {
  419. // Some(unsafe { &mut *(self as *mut Self as *mut T) })
  420. // } else {
  421. // None
  422. // }
  423. // }
  424. // }
  425. // impl Pass for Number {
  426. // type ChildDependencies = ();
  427. // type NodeDependencies = ();
  428. // type ParentDependencies = ();
  429. // type Ctx = ();
  430. // const MASK: NodeMask = NodeMask::new();
  431. // fn pass<'a>(
  432. // &mut self,
  433. // node_view: NodeView,
  434. // node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  435. // parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  436. // children: Option<
  437. // impl Iterator<Item = <Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>,
  438. // >,
  439. // context: <Self::Ctx as Dependancy>::ElementBorrowed<'a>,
  440. // ) -> bool {
  441. // self.0 += 1;
  442. // true
  443. // }
  444. // }
  445. // let mut tree: RealDom<Number> = RealDom::new();
  446. // tree.dirty_nodes.insert(TypeId::of::<Number>(), NodeId(0));
  447. // tree.update_state(SendAnyMap::new());
  448. // assert_eq!(tree.get(tree.root()).unwrap().state.0, 1);
  449. // }
  450. // #[test]
  451. // fn dependant_node_pass() {
  452. // use crate::real_dom::RealDom;
  453. // #[derive(Debug, Default, Clone, PartialEq)]
  454. // struct AddNumber(i32);
  455. // impl Pass for AddNumber {
  456. // type ChildDependencies = ();
  457. // type NodeDependencies = (SubtractNumber,);
  458. // type ParentDependencies = ();
  459. // type Ctx = ();
  460. // const MASK: NodeMask = NodeMask::new();
  461. // fn pass<'a>(
  462. // &mut self,
  463. // node_view: NodeView,
  464. // node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  465. // parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  466. // children: Option<
  467. // impl Iterator<Item = <Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>,
  468. // >,
  469. // context: <Self::Ctx as Dependancy>::ElementBorrowed<'a>,
  470. // ) -> bool {
  471. // self.0 += 1;
  472. // true
  473. // }
  474. // }
  475. // #[derive(Debug, Default, Clone, PartialEq)]
  476. // struct SubtractNumber(i32);
  477. // impl Pass for SubtractNumber {
  478. // type ChildDependencies = ();
  479. // type NodeDependencies = ();
  480. // type ParentDependencies = ();
  481. // type Ctx = ();
  482. // const MASK: NodeMask = NodeMask::new();
  483. // fn pass<'a>(
  484. // &mut self,
  485. // node_view: NodeView,
  486. // node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  487. // parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  488. // children: Option<
  489. // impl Iterator<Item = <Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>,
  490. // >,
  491. // context: <Self::Ctx as Dependancy>::ElementBorrowed<'a>,
  492. // ) -> bool {
  493. // self.0 -= 1;
  494. // true
  495. // }
  496. // }
  497. // #[derive(Debug, Default, Clone, PartialEq)]
  498. // struct NumberState {
  499. // add_number: AddNumber,
  500. // subtract_number: SubtractNumber,
  501. // }
  502. // impl AnyMapLike for NumberState {
  503. // fn get<T: Any+Sync+Send>(&self) -> Option<&T> {
  504. // if TypeId::of::<AddNumber>() == TypeId::of::<T>() {
  505. // Some(unsafe { &*(&self.add_number as *const AddNumber as *const T) })
  506. // } else if TypeId::of::<SubtractNumber>() == TypeId::of::<T>() {
  507. // Some(unsafe { &*(&self.subtract_number as *const SubtractNumber as *const T) })
  508. // } else {
  509. // None
  510. // }
  511. // }
  512. // fn get_mut<T: Any+Sync+Send>(&mut self) -> Option<&mut T> {
  513. // if TypeId::of::<AddNumber>() == TypeId::of::<T>() {
  514. // Some(unsafe { &mut *(&mut self.add_number as *mut AddNumber as *mut T) })
  515. // } else if TypeId::of::<SubtractNumber>() == TypeId::of::<T>() {
  516. // Some(unsafe { &mut *(&mut self.subtract_number as *mut SubtractNumber as *mut T) })
  517. // } else {
  518. // None
  519. // }
  520. // }
  521. // }
  522. // impl State for NumberState {
  523. // fn create_passes() -> Box<[TypeErasedPass<Self>]> {
  524. // Box::new([
  525. // AddNumber::to_type_erased(),
  526. // SubtractNumber::to_type_erased(),
  527. // ])
  528. // }
  529. // }
  530. // let mut tree: RealDom<NumberState> = RealDom::new();
  531. // tree.dirty_nodes
  532. // .insert(TypeId::of::<SubtractNumber>(), NodeId(0));
  533. // tree.update_state(dirty_nodes, SendAnyMap::new());
  534. // assert_eq!(
  535. // tree.get(tree.root()).unwrap().state,
  536. // NumberState {
  537. // add_number: AddNumber(1),
  538. // subtract_number: SubtractNumber(-1)
  539. // }
  540. // );
  541. // }
  542. // #[test]
  543. // fn independant_node_pass() {
  544. // use crate::real_dom::RealDom;
  545. // use crate::tree::{Tree, TreeLike};
  546. // #[derive(Debug, Default, Clone, PartialEq)]
  547. // struct AddNumber(i32);
  548. // impl Pass for AddNumber {
  549. // type ChildDependencies = ();
  550. // type NodeDependencies = ();
  551. // type ParentDependencies = ();
  552. // type Ctx = ();
  553. // const MASK: NodeMask = NodeMask::new();
  554. // fn pass<'a>(
  555. // &mut self,
  556. // node_view: NodeView,
  557. // node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  558. // parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  559. // children: Option<
  560. // impl Iterator<Item = <Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>,
  561. // >,
  562. // context: <Self::Ctx as Dependancy>::ElementBorrowed<'a>,
  563. // ) -> bool {
  564. // self.0 += 1;
  565. // true
  566. // }
  567. // }
  568. // #[derive(Debug, Default, Clone, PartialEq)]
  569. // struct SubtractNumber(i32);
  570. // impl Pass for SubtractNumber {
  571. // type ChildDependencies = ();
  572. // type NodeDependencies = ();
  573. // type ParentDependencies = ();
  574. // type Ctx = ();
  575. // const MASK: NodeMask = NodeMask::new();
  576. // fn pass<'a>(
  577. // &mut self,
  578. // node_view: NodeView,
  579. // node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  580. // parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  581. // children: Option<
  582. // impl Iterator<Item = <Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>,
  583. // >,
  584. // context: <Self::Ctx as Dependancy>::ElementBorrowed<'a>,
  585. // ) -> bool {
  586. // self.0 -= 1;
  587. // true
  588. // }
  589. // }
  590. // #[derive(Debug, Default, Clone, PartialEq)]
  591. // struct NumberState {
  592. // add_number: AddNumber,
  593. // subtract_number: SubtractNumber,
  594. // }
  595. // impl AnyMapLike for NumberState {
  596. // fn get<T: Any+Sync+Send>(&self) -> Option<&T> {
  597. // if TypeId::of::<AddNumber>() == TypeId::of::<T>() {
  598. // Some(unsafe { &*(&self.add_number as *const AddNumber as *const T) })
  599. // } else if TypeId::of::<SubtractNumber>() == TypeId::of::<T>() {
  600. // Some(unsafe { &*(&self.subtract_number as *const SubtractNumber as *const T) })
  601. // } else {
  602. // None
  603. // }
  604. // }
  605. // fn get_mut<T: Any+Sync+Send>(&mut self) -> Option<&mut T> {
  606. // if TypeId::of::<AddNumber>() == TypeId::of::<T>() {
  607. // Some(unsafe { &mut *(&mut self.add_number as *mut AddNumber as *mut T) })
  608. // } else if TypeId::of::<SubtractNumber>() == TypeId::of::<T>() {
  609. // Some(unsafe { &mut *(&mut self.subtract_number as *mut SubtractNumber as *mut T) })
  610. // } else {
  611. // None
  612. // }
  613. // }
  614. // }
  615. // impl State for NumberState {
  616. // fn create_passes() -> Box<[TypeErasedPass<Self>]> {
  617. // Box::new([
  618. // AddNumber::to_type_erased(),
  619. // SubtractNumber::to_type_erased(),
  620. // ])
  621. // }
  622. // }
  623. // let mut tree: RealDom<NumberState> = RealDom::new();
  624. // tree.dirty_nodes
  625. // .insert(TypeId::of::<SubtractNumber>(), NodeId(0));
  626. // tree.update_state(SendAnyMap::new());
  627. // assert_eq!(
  628. // tree.get(tree.root()).unwrap().state,
  629. // NumberState {
  630. // add_number: AddNumber(0),
  631. // subtract_number: SubtractNumber(-1)
  632. // }
  633. // );
  634. // }
  635. // #[test]
  636. // fn down_pass() {
  637. // use crate::real_dom::RealDom;
  638. // use crate::tree::{Tree, TreeLike};
  639. // #[derive(Debug, Default, Clone, PartialEq)]
  640. // struct AddNumber(i32);
  641. // impl Pass for AddNumber {
  642. // type ChildDependencies = ();
  643. // type NodeDependencies = ();
  644. // type ParentDependencies = (AddNumber,);
  645. // type Ctx = ();
  646. // const MASK: NodeMask = NodeMask::new();
  647. // fn pass<'a>(
  648. // &mut self,
  649. // node_view: NodeView,
  650. // node: <Self::NodeDependencies as Dependancy>::ElementBorrowed<'a>,
  651. // parent: Option<<Self::ParentDependencies as Dependancy>::ElementBorrowed<'a>>,
  652. // children: Option<
  653. // impl Iterator<Item = <Self::ChildDependencies as Dependancy>::ElementBorrowed<'a>>,
  654. // >,
  655. // context: <Self::Ctx as Dependancy>::ElementBorrowed<'a>,
  656. // ) -> bool {
  657. // if let Some((parent,)) = parent {
  658. // *self.0 += *parent.0;
  659. // }
  660. // true
  661. // }
  662. // }
  663. // #[derive(Debug, Default, Clone, PartialEq)]
  664. // struct NumberState {
  665. // add_number: AddNumber,
  666. // }
  667. // impl AnyMapLike for NumberState {
  668. // fn get<T: Any+Sync+Send>(&self) -> Option<&T> {
  669. // if TypeId::of::<AddNumber>() == TypeId::of::<T>() {
  670. // Some(unsafe { &*(&self.add_number as *const AddNumber as *const T) })
  671. // } else {
  672. // None
  673. // }
  674. // }
  675. // fn get_mut<T: Any+Sync+Send>(&mut self) -> Option<&mut T> {
  676. // if TypeId::of::<AddNumber>() == TypeId::of::<T>() {
  677. // Some(unsafe { &mut *(&mut self.add_number as *mut AddNumber as *mut T) })
  678. // } else {
  679. // None
  680. // }
  681. // }
  682. // }
  683. // impl State for NumberState {
  684. // fn create_passes() -> Box<[TypeErasedPass<Self>]> {
  685. // Box::new([AddNumber::to_type_erased()])
  686. // }
  687. // }
  688. // let mut tree: RealDom<NumberState> = RealDom::new();
  689. // let parent = tree.root();
  690. // let child1 = tree.create_node(1);
  691. // tree.add_child(parent, child1);
  692. // let grandchild1 = tree.create_node(1);
  693. // tree.add_child(child1, grandchild1);
  694. // let child2 = tree.create_node(1);
  695. // tree.add_child(parent, child2);
  696. // let grandchild2 = tree.create_node(1);
  697. // tree.add_child(child2, grandchild2);
  698. // tree.dirty_nodes
  699. // .insert(TypeId::of::<AddNumber>(), NodeId(0));
  700. // tree.update_state(SendAnyMap::new());
  701. // assert_eq!(tree.get(tree.root()).unwrap().state.add_number.0, 1);
  702. // assert_eq!(tree.get(child1).unwrap().state.add_number.0, 2);
  703. // assert_eq!(tree.get(grandchild1).unwrap().state.add_number.0, 3);
  704. // assert_eq!(tree.get(child2).unwrap().state.add_number.0, 2);
  705. // assert_eq!(tree.get(grandchild2).unwrap().state.add_number.0, 3);
  706. // }
  707. // #[test]
  708. // fn dependant_down_pass() {
  709. // use crate::tree::{Tree, TreeLike};
  710. // // 0
  711. // let mut tree = Tree::new(1);
  712. // let parent = tree.root();
  713. // // 1
  714. // let child1 = tree.create_node(1);
  715. // tree.add_child(parent, child1);
  716. // // 2
  717. // let grandchild1 = tree.create_node(1);
  718. // tree.add_child(child1, grandchild1);
  719. // // 3
  720. // let child2 = tree.create_node(1);
  721. // tree.add_child(parent, child2);
  722. // // 4
  723. // let grandchild2 = tree.create_node(1);
  724. // tree.add_child(child2, grandchild2);
  725. // struct AddPass;
  726. // impl Pass for AddPass {
  727. // fn pass_id(&self) -> PassId {
  728. // PassId(0)
  729. // }
  730. // fn dependancies(&self) -> &'static [PassId] {
  731. // &[PassId(1)]
  732. // }
  733. // fn dependants(&self) -> &'static [PassId] {
  734. // &[]
  735. // }
  736. // fn mask(&self) -> MemberMask {
  737. // MemberMask(0)
  738. // }
  739. // }
  740. // impl DownwardPass<i32> for AddPass {
  741. // fn pass(&self, node: &mut i32, parent: Option<&mut i32>, _: &SendAnyMap) -> PassReturn {
  742. // if let Some(parent) = parent {
  743. // *node += *parent;
  744. // } else {
  745. // }
  746. // PassReturn {
  747. // progress: true,
  748. // mark_dirty: true,
  749. // }
  750. // }
  751. // }
  752. // struct SubtractPass;
  753. // impl Pass for SubtractPass {
  754. // fn pass_id(&self) -> PassId {
  755. // PassId(1)
  756. // }
  757. // fn dependancies(&self) -> &'static [PassId] {
  758. // &[]
  759. // }
  760. // fn dependants(&self) -> &'static [PassId] {
  761. // &[PassId(0)]
  762. // }
  763. // fn mask(&self) -> MemberMask {
  764. // MemberMask(0)
  765. // }
  766. // }
  767. // impl DownwardPass<i32> for SubtractPass {
  768. // fn pass(&self, node: &mut i32, parent: Option<&mut i32>, _: &SendAnyMap) -> PassReturn {
  769. // if let Some(parent) = parent {
  770. // *node -= *parent;
  771. // } else {
  772. // }
  773. // PassReturn {
  774. // progress: true,
  775. // mark_dirty: true,
  776. // }
  777. // }
  778. // }
  779. // let add_pass = AnyPass::Downward(&AddPass);
  780. // let subtract_pass = AnyPass::Downward(&SubtractPass);
  781. // let passes = vec![&add_pass, &subtract_pass];
  782. // let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  783. // dirty_nodes.insert(PassId(1), tree.root());
  784. // resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  785. // // Tree before:
  786. // // 1=\
  787. // // 1=\
  788. // // 1
  789. // // 1=\
  790. // // 1
  791. // // Tree after subtract:
  792. // // 1=\
  793. // // 0=\
  794. // // 1
  795. // // 0=\
  796. // // 1
  797. // // Tree after add:
  798. // // 1=\
  799. // // 1=\
  800. // // 2
  801. // // 1=\
  802. // // 2
  803. // assert_eq!(tree.get(tree.root()).unwrap(), &1);
  804. // assert_eq!(tree.get(child1).unwrap(), &1);
  805. // assert_eq!(tree.get(grandchild1).unwrap(), &2);
  806. // assert_eq!(tree.get(child2).unwrap(), &1);
  807. // assert_eq!(tree.get(grandchild2).unwrap(), &2);
  808. // }
  809. // #[test]
  810. // fn up_pass() {
  811. // use crate::tree::{Tree, TreeLike};
  812. // // Tree before:
  813. // // 0=\
  814. // // 0=\
  815. // // 1
  816. // // 0=\
  817. // // 1
  818. // // Tree after:
  819. // // 2=\
  820. // // 1=\
  821. // // 1
  822. // // 1=\
  823. // // 1
  824. // let mut tree = Tree::new(0);
  825. // let parent = tree.root();
  826. // let child1 = tree.create_node(0);
  827. // tree.add_child(parent, child1);
  828. // let grandchild1 = tree.create_node(1);
  829. // tree.add_child(child1, grandchild1);
  830. // let child2 = tree.create_node(0);
  831. // tree.add_child(parent, child2);
  832. // let grandchild2 = tree.create_node(1);
  833. // tree.add_child(child2, grandchild2);
  834. // struct AddPass;
  835. // impl Pass for AddPass {
  836. // fn pass_id(&self) -> PassId {
  837. // PassId(0)
  838. // }
  839. // fn dependancies(&self) -> &'static [PassId] {
  840. // &[]
  841. // }
  842. // fn dependants(&self) -> &'static [PassId] {
  843. // &[]
  844. // }
  845. // fn mask(&self) -> MemberMask {
  846. // MemberMask(0)
  847. // }
  848. // }
  849. // impl UpwardPass<i32> for AddPass {
  850. // fn pass<'a>(
  851. // &self,
  852. // node: &mut i32,
  853. // children: &mut dyn Iterator<Item = &'a mut i32>,
  854. // _: &SendAnyMap,
  855. // ) -> PassReturn {
  856. // *node += children.map(|i| *i).sum::<i32>();
  857. // PassReturn {
  858. // progress: true,
  859. // mark_dirty: true,
  860. // }
  861. // }
  862. // }
  863. // let add_pass = AnyPass::Upward(&AddPass);
  864. // let passes = vec![&add_pass];
  865. // let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  866. // dirty_nodes.insert(PassId(0), grandchild1);
  867. // dirty_nodes.insert(PassId(0), grandchild2);
  868. // resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  869. // assert_eq!(tree.get(tree.root()).unwrap(), &2);
  870. // assert_eq!(tree.get(child1).unwrap(), &1);
  871. // assert_eq!(tree.get(grandchild1).unwrap(), &1);
  872. // assert_eq!(tree.get(child2).unwrap(), &1);
  873. // assert_eq!(tree.get(grandchild2).unwrap(), &1);
  874. // }
  875. // #[test]
  876. // fn dependant_up_pass() {
  877. // use crate::tree::{Tree, TreeLike};
  878. // // 0
  879. // let mut tree = Tree::new(0);
  880. // let parent = tree.root();
  881. // // 1
  882. // let child1 = tree.create_node(0);
  883. // tree.add_child(parent, child1);
  884. // // 2
  885. // let grandchild1 = tree.create_node(1);
  886. // tree.add_child(child1, grandchild1);
  887. // // 3
  888. // let child2 = tree.create_node(0);
  889. // tree.add_child(parent, child2);
  890. // // 4
  891. // let grandchild2 = tree.create_node(1);
  892. // tree.add_child(child2, grandchild2);
  893. // struct AddPass;
  894. // impl Pass for AddPass {
  895. // fn pass_id(&self) -> PassId {
  896. // PassId(0)
  897. // }
  898. // fn dependancies(&self) -> &'static [PassId] {
  899. // &[PassId(1)]
  900. // }
  901. // fn dependants(&self) -> &'static [PassId] {
  902. // &[]
  903. // }
  904. // fn mask(&self) -> MemberMask {
  905. // MemberMask(0)
  906. // }
  907. // }
  908. // impl UpwardPass<i32> for AddPass {
  909. // fn pass<'a>(
  910. // &self,
  911. // node: &mut i32,
  912. // children: &mut dyn Iterator<Item = &'a mut i32>,
  913. // _: &SendAnyMap,
  914. // ) -> PassReturn {
  915. // *node += children.map(|i| *i).sum::<i32>();
  916. // PassReturn {
  917. // progress: true,
  918. // mark_dirty: true,
  919. // }
  920. // }
  921. // }
  922. // struct SubtractPass;
  923. // impl Pass for SubtractPass {
  924. // fn pass_id(&self) -> PassId {
  925. // PassId(1)
  926. // }
  927. // fn dependancies(&self) -> &'static [PassId] {
  928. // &[]
  929. // }
  930. // fn dependants(&self) -> &'static [PassId] {
  931. // &[PassId(0)]
  932. // }
  933. // fn mask(&self) -> MemberMask {
  934. // MemberMask(0)
  935. // }
  936. // }
  937. // impl UpwardPass<i32> for SubtractPass {
  938. // fn pass<'a>(
  939. // &self,
  940. // node: &mut i32,
  941. // children: &mut dyn Iterator<Item = &'a mut i32>,
  942. // _: &SendAnyMap,
  943. // ) -> PassReturn {
  944. // *node -= children.map(|i| *i).sum::<i32>();
  945. // PassReturn {
  946. // progress: true,
  947. // mark_dirty: true,
  948. // }
  949. // }
  950. // }
  951. // let add_pass = AnyPass::Upward(&AddPass);
  952. // let subtract_pass = AnyPass::Upward(&SubtractPass);
  953. // let passes = vec![&add_pass, &subtract_pass];
  954. // let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  955. // dirty_nodes.insert(PassId(1), grandchild1);
  956. // dirty_nodes.insert(PassId(1), grandchild2);
  957. // resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  958. // // Tree before:
  959. // // 0=\
  960. // // 0=\
  961. // // 1
  962. // // 0=\
  963. // // 1
  964. // // Tree after subtract:
  965. // // 2=\
  966. // // -1=\
  967. // // 1
  968. // // -1=\
  969. // // 1
  970. // // Tree after add:
  971. // // 2=\
  972. // // 0=\
  973. // // 1
  974. // // 0=\
  975. // // 1
  976. // assert_eq!(tree.get(tree.root()).unwrap(), &2);
  977. // assert_eq!(tree.get(child1).unwrap(), &0);
  978. // assert_eq!(tree.get(grandchild1).unwrap(), &1);
  979. // assert_eq!(tree.get(child2).unwrap(), &0);
  980. // assert_eq!(tree.get(grandchild2).unwrap(), &1);
  981. // }