passes.rs 35 KB

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