passes.rs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  1. use crate::tree::{NodeId, TreeView};
  2. use crate::{FxDashMap, FxDashSet, SendAnyMap};
  3. use rustc_hash::{FxHashMap, FxHashSet};
  4. use std::collections::BTreeMap;
  5. use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign};
  6. use std::sync::atomic::{AtomicU64, Ordering};
  7. use std::sync::Arc;
  8. #[derive(Debug, Clone, PartialEq, Eq, Default)]
  9. pub struct DirtyNodes {
  10. map: BTreeMap<u16, FxHashSet<NodeId>>,
  11. }
  12. impl DirtyNodes {
  13. pub fn insert(&mut self, depth: u16, node_id: NodeId) {
  14. self.map
  15. .entry(depth)
  16. .or_insert_with(FxHashSet::default)
  17. .insert(node_id);
  18. }
  19. fn pop_front(&mut self) -> Option<NodeId> {
  20. let (&depth, values) = self.map.iter_mut().next()?;
  21. let key = *values.iter().next()?;
  22. let node_id = values.take(&key)?;
  23. if values.is_empty() {
  24. self.map.remove(&depth);
  25. }
  26. Some(node_id)
  27. }
  28. fn pop_back(&mut self) -> Option<NodeId> {
  29. let (&depth, values) = self.map.iter_mut().rev().next()?;
  30. let key = *values.iter().next()?;
  31. let node_id = values.take(&key)?;
  32. if values.is_empty() {
  33. self.map.remove(&depth);
  34. }
  35. Some(node_id)
  36. }
  37. }
  38. #[test]
  39. fn dirty_nodes() {
  40. let mut dirty_nodes = DirtyNodes::default();
  41. dirty_nodes.insert(1, NodeId(1));
  42. dirty_nodes.insert(0, NodeId(0));
  43. dirty_nodes.insert(2, NodeId(3));
  44. dirty_nodes.insert(1, NodeId(2));
  45. assert_eq!(dirty_nodes.pop_front(), Some(NodeId(0)));
  46. assert!(matches!(dirty_nodes.pop_front(), Some(NodeId(1 | 2))));
  47. assert!(matches!(dirty_nodes.pop_front(), Some(NodeId(1 | 2))));
  48. assert_eq!(dirty_nodes.pop_front(), Some(NodeId(3)));
  49. }
  50. #[derive(Default)]
  51. pub struct DirtyNodeStates {
  52. dirty: FxDashMap<NodeId, Vec<AtomicU64>>,
  53. }
  54. impl DirtyNodeStates {
  55. pub fn new(starting_nodes: FxHashMap<NodeId, FxHashSet<PassId>>) -> Self {
  56. let this = Self::default();
  57. for (node, nodes) in starting_nodes {
  58. for pass_id in nodes {
  59. this.insert(pass_id, node);
  60. }
  61. }
  62. this
  63. }
  64. pub fn insert(&self, pass_id: PassId, node_id: NodeId) {
  65. let pass_id = pass_id.0;
  66. let index = pass_id / 64;
  67. let bit = pass_id % 64;
  68. let encoded = 1 << bit;
  69. if let Some(dirty) = self.dirty.get(&node_id) {
  70. if let Some(atomic) = dirty.get(index as usize) {
  71. atomic.fetch_or(encoded, Ordering::Relaxed);
  72. } else {
  73. drop(dirty);
  74. let mut write = self.dirty.get_mut(&node_id).unwrap();
  75. write.resize_with(index as usize + 1, || AtomicU64::new(0));
  76. write[index as usize].fetch_or(encoded, Ordering::Relaxed);
  77. }
  78. } else {
  79. let mut v = Vec::with_capacity(index as usize + 1);
  80. v.resize_with(index as usize + 1, || AtomicU64::new(0));
  81. v[index as usize].fetch_or(encoded, Ordering::Relaxed);
  82. self.dirty.insert(node_id, v);
  83. }
  84. }
  85. fn all_dirty<T>(&self, pass_id: PassId, dirty_nodes: &mut DirtyNodes, tree: &impl TreeView<T>) {
  86. let pass_id = pass_id.0;
  87. let index = pass_id / 64;
  88. let bit = pass_id % 64;
  89. let encoded = 1 << bit;
  90. for entry in self.dirty.iter() {
  91. let node_id = entry.key();
  92. let dirty = entry.value();
  93. if let Some(atomic) = dirty.get(index as usize) {
  94. if atomic.load(Ordering::Relaxed) & encoded != 0 {
  95. dirty_nodes.insert(tree.height(*node_id).unwrap(), *node_id);
  96. }
  97. }
  98. }
  99. }
  100. }
  101. #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, PartialOrd, Ord)]
  102. pub struct PassId(pub u64);
  103. #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy, Default)]
  104. pub struct MemberMask(pub u64);
  105. impl MemberMask {
  106. pub fn overlaps(&self, other: Self) -> bool {
  107. (*self & other).0 != 0
  108. }
  109. }
  110. impl BitAndAssign for MemberMask {
  111. fn bitand_assign(&mut self, rhs: Self) {
  112. self.0 &= rhs.0;
  113. }
  114. }
  115. impl BitAnd for MemberMask {
  116. type Output = Self;
  117. fn bitand(self, rhs: Self) -> Self::Output {
  118. MemberMask(self.0 & rhs.0)
  119. }
  120. }
  121. impl BitOrAssign for MemberMask {
  122. fn bitor_assign(&mut self, rhs: Self) {
  123. self.0 |= rhs.0;
  124. }
  125. }
  126. impl BitOr for MemberMask {
  127. type Output = Self;
  128. fn bitor(self, rhs: Self) -> Self::Output {
  129. Self(self.0 | rhs.0)
  130. }
  131. }
  132. pub struct PassReturn {
  133. pub progress: bool,
  134. pub mark_dirty: bool,
  135. }
  136. pub trait Pass {
  137. fn pass_id(&self) -> PassId;
  138. fn dependancies(&self) -> &'static [PassId];
  139. fn dependants(&self) -> &'static [PassId];
  140. fn mask(&self) -> MemberMask;
  141. }
  142. pub trait UpwardPass<T>: Pass {
  143. fn pass<'a>(
  144. &self,
  145. node: &mut T,
  146. children: &mut dyn Iterator<Item = &'a mut T>,
  147. ctx: &SendAnyMap,
  148. ) -> PassReturn;
  149. }
  150. fn resolve_upward_pass<T, P: UpwardPass<T> + ?Sized>(
  151. tree: &mut impl TreeView<T>,
  152. pass: &P,
  153. mut dirty: DirtyNodes,
  154. dirty_states: &DirtyNodeStates,
  155. nodes_updated: &FxDashSet<NodeId>,
  156. ctx: &SendAnyMap,
  157. ) {
  158. while let Some(id) = dirty.pop_back() {
  159. let (node, mut children) = tree.parent_child_mut(id).unwrap();
  160. let result = pass.pass(node, &mut children, ctx);
  161. drop(children);
  162. if result.progress || result.mark_dirty {
  163. nodes_updated.insert(id);
  164. if let Some(id) = tree.parent_id(id) {
  165. if result.mark_dirty {
  166. for dependant in pass.dependants() {
  167. dirty_states.insert(*dependant, id);
  168. }
  169. }
  170. if result.progress {
  171. let height = tree.height(id).unwrap();
  172. dirty.insert(height, id);
  173. }
  174. }
  175. }
  176. }
  177. }
  178. pub trait DownwardPass<T>: Pass {
  179. fn pass(&self, node: &mut T, parent: Option<&mut T>, ctx: &SendAnyMap) -> PassReturn;
  180. }
  181. fn resolve_downward_pass<T, P: DownwardPass<T> + ?Sized>(
  182. tree: &mut impl TreeView<T>,
  183. pass: &P,
  184. mut dirty: DirtyNodes,
  185. dirty_states: &DirtyNodeStates,
  186. nodes_updated: &FxDashSet<NodeId>,
  187. ctx: &SendAnyMap,
  188. ) {
  189. while let Some(id) = dirty.pop_front() {
  190. let (node, parent) = tree.node_parent_mut(id).unwrap();
  191. let result = pass.pass(node, parent, ctx);
  192. if result.mark_dirty {
  193. nodes_updated.insert(id);
  194. }
  195. if result.mark_dirty || result.progress {
  196. for id in tree.children_ids(id).unwrap() {
  197. if result.mark_dirty {
  198. for dependant in pass.dependants() {
  199. dirty_states.insert(*dependant, *id);
  200. }
  201. }
  202. if result.progress {
  203. let height = tree.height(*id).unwrap();
  204. dirty.insert(height, *id);
  205. }
  206. }
  207. }
  208. }
  209. }
  210. pub trait NodePass<T>: Pass {
  211. fn pass(&self, node: &mut T, ctx: &SendAnyMap) -> bool;
  212. }
  213. fn resolve_node_pass<T, P: NodePass<T> + ?Sized>(
  214. tree: &mut impl TreeView<T>,
  215. pass: &P,
  216. mut dirty: DirtyNodes,
  217. dirty_states: &DirtyNodeStates,
  218. nodes_updated: &FxDashSet<NodeId>,
  219. ctx: &SendAnyMap,
  220. ) {
  221. while let Some(id) = dirty.pop_back() {
  222. let node = tree.get_mut(id).unwrap();
  223. if pass.pass(node, ctx) {
  224. nodes_updated.insert(id);
  225. for dependant in pass.dependants() {
  226. dirty_states.insert(*dependant, id);
  227. }
  228. }
  229. }
  230. }
  231. pub enum AnyPass<T: 'static> {
  232. Upward(&'static (dyn UpwardPass<T> + Send + Sync + 'static)),
  233. Downward(&'static (dyn DownwardPass<T> + Send + Sync + 'static)),
  234. Node(&'static (dyn NodePass<T> + Send + Sync + 'static)),
  235. }
  236. impl<T> AnyPass<T> {
  237. pub fn pass_id(&self) -> PassId {
  238. match self {
  239. Self::Upward(pass) => pass.pass_id(),
  240. Self::Downward(pass) => pass.pass_id(),
  241. Self::Node(pass) => pass.pass_id(),
  242. }
  243. }
  244. pub fn dependancies(&self) -> &'static [PassId] {
  245. match self {
  246. Self::Upward(pass) => pass.dependancies(),
  247. Self::Downward(pass) => pass.dependancies(),
  248. Self::Node(pass) => pass.dependancies(),
  249. }
  250. }
  251. fn mask(&self) -> MemberMask {
  252. match self {
  253. Self::Upward(pass) => pass.mask(),
  254. Self::Downward(pass) => pass.mask(),
  255. Self::Node(pass) => pass.mask(),
  256. }
  257. }
  258. fn resolve(
  259. &self,
  260. tree: &mut impl TreeView<T>,
  261. dirty: DirtyNodes,
  262. dirty_states: &DirtyNodeStates,
  263. nodes_updated: &FxDashSet<NodeId>,
  264. ctx: &SendAnyMap,
  265. ) {
  266. match self {
  267. Self::Downward(pass) => {
  268. resolve_downward_pass(tree, *pass, dirty, dirty_states, nodes_updated, ctx)
  269. }
  270. Self::Upward(pass) => {
  271. resolve_upward_pass(tree, *pass, dirty, dirty_states, nodes_updated, ctx)
  272. }
  273. Self::Node(pass) => {
  274. resolve_node_pass(tree, *pass, dirty, dirty_states, nodes_updated, ctx)
  275. }
  276. }
  277. }
  278. }
  279. struct RawPointer<T>(*mut T);
  280. unsafe impl<T> Send for RawPointer<T> {}
  281. unsafe impl<T> Sync for RawPointer<T> {}
  282. pub fn resolve_passes<T, Tr: TreeView<T>>(
  283. tree: &mut Tr,
  284. dirty_nodes: DirtyNodeStates,
  285. mut passes: Vec<&AnyPass<T>>,
  286. ctx: SendAnyMap,
  287. ) -> FxDashSet<NodeId> {
  288. let dirty_states = Arc::new(dirty_nodes);
  289. let mut resolved_passes: FxHashSet<PassId> = FxHashSet::default();
  290. let mut resolving = Vec::new();
  291. let nodes_updated = Arc::new(FxDashSet::default());
  292. let ctx = Arc::new(ctx);
  293. while !passes.is_empty() {
  294. let mut currently_borrowed = MemberMask::default();
  295. std::thread::scope(|s| {
  296. let mut i = 0;
  297. while i < passes.len() {
  298. let pass = &passes[i];
  299. let pass_id = pass.pass_id();
  300. let pass_mask = pass.mask();
  301. if pass
  302. .dependancies()
  303. .iter()
  304. .all(|d| resolved_passes.contains(d) || *d == pass_id)
  305. && !pass_mask.overlaps(currently_borrowed)
  306. {
  307. let pass = passes.remove(i);
  308. resolving.push(pass_id);
  309. currently_borrowed |= pass_mask;
  310. let tree_mut = tree as *mut _;
  311. let raw_ptr = RawPointer(tree_mut);
  312. let dirty_states = dirty_states.clone();
  313. let nodes_updated = nodes_updated.clone();
  314. let ctx = ctx.clone();
  315. s.spawn(move || unsafe {
  316. // let tree_mut: &mut Tr = &mut *raw_ptr.0;
  317. let raw = raw_ptr;
  318. // this is safe because the member_mask acts as a per-member mutex and we have verified that the pass does not overlap with any other pass
  319. let tree_mut: &mut Tr = &mut *raw.0;
  320. let mut dirty = DirtyNodes::default();
  321. dirty_states.all_dirty(pass_id, &mut dirty, tree_mut);
  322. pass.resolve(tree_mut, dirty, &dirty_states, &nodes_updated, &ctx);
  323. });
  324. } else {
  325. i += 1;
  326. }
  327. }
  328. // all passes are resolved at the end of the scope
  329. });
  330. resolved_passes.extend(resolving.iter().copied());
  331. resolving.clear()
  332. }
  333. std::sync::Arc::try_unwrap(nodes_updated).unwrap()
  334. }
  335. #[test]
  336. fn node_pass() {
  337. use crate::tree::{Tree, TreeLike};
  338. let mut tree = Tree::new(0);
  339. struct AddPass;
  340. impl Pass for AddPass {
  341. fn pass_id(&self) -> PassId {
  342. PassId(0)
  343. }
  344. fn dependancies(&self) -> &'static [PassId] {
  345. &[]
  346. }
  347. fn dependants(&self) -> &'static [PassId] {
  348. &[]
  349. }
  350. fn mask(&self) -> MemberMask {
  351. MemberMask(0)
  352. }
  353. }
  354. impl NodePass<i32> for AddPass {
  355. fn pass(&self, node: &mut i32, _: &SendAnyMap) -> bool {
  356. *node += 1;
  357. true
  358. }
  359. }
  360. let add_pass = AnyPass::Node(&AddPass);
  361. let passes = vec![&add_pass];
  362. let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  363. dirty_nodes.insert(PassId(0), tree.root());
  364. resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  365. assert_eq!(tree.get(tree.root()).unwrap(), &1);
  366. }
  367. #[test]
  368. fn dependant_node_pass() {
  369. use crate::tree::{Tree, TreeLike};
  370. let mut tree = Tree::new(0);
  371. struct AddPass;
  372. impl Pass for AddPass {
  373. fn pass_id(&self) -> PassId {
  374. PassId(0)
  375. }
  376. fn dependancies(&self) -> &'static [PassId] {
  377. &[PassId(1)]
  378. }
  379. fn dependants(&self) -> &'static [PassId] {
  380. &[]
  381. }
  382. fn mask(&self) -> MemberMask {
  383. MemberMask(0)
  384. }
  385. }
  386. impl NodePass<i32> for AddPass {
  387. fn pass(&self, node: &mut i32, _: &SendAnyMap) -> bool {
  388. *node += 1;
  389. true
  390. }
  391. }
  392. struct SubtractPass;
  393. impl Pass for SubtractPass {
  394. fn pass_id(&self) -> PassId {
  395. PassId(1)
  396. }
  397. fn dependancies(&self) -> &'static [PassId] {
  398. &[]
  399. }
  400. fn dependants(&self) -> &'static [PassId] {
  401. &[PassId(0)]
  402. }
  403. fn mask(&self) -> MemberMask {
  404. MemberMask(0)
  405. }
  406. }
  407. impl NodePass<i32> for SubtractPass {
  408. fn pass(&self, node: &mut i32, _: &SendAnyMap) -> bool {
  409. *node -= 1;
  410. true
  411. }
  412. }
  413. let add_pass = AnyPass::Node(&AddPass);
  414. let subtract_pass = AnyPass::Node(&SubtractPass);
  415. let passes = vec![&add_pass, &subtract_pass];
  416. let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  417. dirty_nodes.insert(PassId(1), tree.root());
  418. resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  419. assert_eq!(*tree.get(tree.root()).unwrap(), 0);
  420. }
  421. #[test]
  422. fn independant_node_pass() {
  423. use crate::tree::{Tree, TreeLike};
  424. let mut tree = Tree::new((0, 0));
  425. struct AddPass1;
  426. impl Pass for AddPass1 {
  427. fn pass_id(&self) -> PassId {
  428. PassId(0)
  429. }
  430. fn dependancies(&self) -> &'static [PassId] {
  431. &[]
  432. }
  433. fn dependants(&self) -> &'static [PassId] {
  434. &[]
  435. }
  436. fn mask(&self) -> MemberMask {
  437. MemberMask(0)
  438. }
  439. }
  440. impl NodePass<(i32, i32)> for AddPass1 {
  441. fn pass(&self, node: &mut (i32, i32), _: &SendAnyMap) -> bool {
  442. node.0 += 1;
  443. true
  444. }
  445. }
  446. struct AddPass2;
  447. impl Pass for AddPass2 {
  448. fn pass_id(&self) -> PassId {
  449. PassId(1)
  450. }
  451. fn dependancies(&self) -> &'static [PassId] {
  452. &[]
  453. }
  454. fn dependants(&self) -> &'static [PassId] {
  455. &[]
  456. }
  457. fn mask(&self) -> MemberMask {
  458. MemberMask(1)
  459. }
  460. }
  461. impl NodePass<(i32, i32)> for AddPass2 {
  462. fn pass(&self, node: &mut (i32, i32), _: &SendAnyMap) -> bool {
  463. node.1 += 1;
  464. true
  465. }
  466. }
  467. let add_pass1 = AnyPass::Node(&AddPass1);
  468. let add_pass2 = AnyPass::Node(&AddPass2);
  469. let passes = vec![&add_pass1, &add_pass2];
  470. let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  471. dirty_nodes.insert(PassId(0), tree.root());
  472. dirty_nodes.insert(PassId(1), tree.root());
  473. resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  474. assert_eq!(tree.get(tree.root()).unwrap(), &(1, 1));
  475. }
  476. #[test]
  477. fn down_pass() {
  478. use crate::tree::{Tree, TreeLike};
  479. let mut tree = Tree::new(1);
  480. let parent = tree.root();
  481. let child1 = tree.create_node(1);
  482. tree.add_child(parent, child1);
  483. let grandchild1 = tree.create_node(1);
  484. tree.add_child(child1, grandchild1);
  485. let child2 = tree.create_node(1);
  486. tree.add_child(parent, child2);
  487. let grandchild2 = tree.create_node(1);
  488. tree.add_child(child2, grandchild2);
  489. struct AddPass;
  490. impl Pass for AddPass {
  491. fn pass_id(&self) -> PassId {
  492. PassId(0)
  493. }
  494. fn dependancies(&self) -> &'static [PassId] {
  495. &[]
  496. }
  497. fn dependants(&self) -> &'static [PassId] {
  498. &[]
  499. }
  500. fn mask(&self) -> MemberMask {
  501. MemberMask(0)
  502. }
  503. }
  504. impl DownwardPass<i32> for AddPass {
  505. fn pass(&self, node: &mut i32, parent: Option<&mut i32>, _: &SendAnyMap) -> PassReturn {
  506. if let Some(parent) = parent {
  507. *node += *parent;
  508. }
  509. PassReturn {
  510. progress: true,
  511. mark_dirty: true,
  512. }
  513. }
  514. }
  515. let add_pass = AnyPass::Downward(&AddPass);
  516. let passes = vec![&add_pass];
  517. let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  518. dirty_nodes.insert(PassId(0), tree.root());
  519. resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  520. assert_eq!(tree.get(tree.root()).unwrap(), &1);
  521. assert_eq!(tree.get(child1).unwrap(), &2);
  522. assert_eq!(tree.get(grandchild1).unwrap(), &3);
  523. assert_eq!(tree.get(child2).unwrap(), &2);
  524. assert_eq!(tree.get(grandchild2).unwrap(), &3);
  525. }
  526. #[test]
  527. fn dependant_down_pass() {
  528. use crate::tree::{Tree, TreeLike};
  529. // 0
  530. let mut tree = Tree::new(1);
  531. let parent = tree.root();
  532. // 1
  533. let child1 = tree.create_node(1);
  534. tree.add_child(parent, child1);
  535. // 2
  536. let grandchild1 = tree.create_node(1);
  537. tree.add_child(child1, grandchild1);
  538. // 3
  539. let child2 = tree.create_node(1);
  540. tree.add_child(parent, child2);
  541. // 4
  542. let grandchild2 = tree.create_node(1);
  543. tree.add_child(child2, grandchild2);
  544. struct AddPass;
  545. impl Pass for AddPass {
  546. fn pass_id(&self) -> PassId {
  547. PassId(0)
  548. }
  549. fn dependancies(&self) -> &'static [PassId] {
  550. &[PassId(1)]
  551. }
  552. fn dependants(&self) -> &'static [PassId] {
  553. &[]
  554. }
  555. fn mask(&self) -> MemberMask {
  556. MemberMask(0)
  557. }
  558. }
  559. impl DownwardPass<i32> for AddPass {
  560. fn pass(&self, node: &mut i32, parent: Option<&mut i32>, _: &SendAnyMap) -> PassReturn {
  561. if let Some(parent) = parent {
  562. *node += *parent;
  563. } else {
  564. }
  565. PassReturn {
  566. progress: true,
  567. mark_dirty: true,
  568. }
  569. }
  570. }
  571. struct SubtractPass;
  572. impl Pass for SubtractPass {
  573. fn pass_id(&self) -> PassId {
  574. PassId(1)
  575. }
  576. fn dependancies(&self) -> &'static [PassId] {
  577. &[]
  578. }
  579. fn dependants(&self) -> &'static [PassId] {
  580. &[PassId(0)]
  581. }
  582. fn mask(&self) -> MemberMask {
  583. MemberMask(0)
  584. }
  585. }
  586. impl DownwardPass<i32> for SubtractPass {
  587. fn pass(&self, node: &mut i32, parent: Option<&mut i32>, _: &SendAnyMap) -> PassReturn {
  588. if let Some(parent) = parent {
  589. *node -= *parent;
  590. } else {
  591. }
  592. PassReturn {
  593. progress: true,
  594. mark_dirty: true,
  595. }
  596. }
  597. }
  598. let add_pass = AnyPass::Downward(&AddPass);
  599. let subtract_pass = AnyPass::Downward(&SubtractPass);
  600. let passes = vec![&add_pass, &subtract_pass];
  601. let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  602. dirty_nodes.insert(PassId(1), tree.root());
  603. resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  604. // Tree before:
  605. // 1=\
  606. // 1=\
  607. // 1
  608. // 1=\
  609. // 1
  610. // Tree after subtract:
  611. // 1=\
  612. // 0=\
  613. // 1
  614. // 0=\
  615. // 1
  616. // Tree after add:
  617. // 1=\
  618. // 1=\
  619. // 2
  620. // 1=\
  621. // 2
  622. assert_eq!(tree.get(tree.root()).unwrap(), &1);
  623. assert_eq!(tree.get(child1).unwrap(), &1);
  624. assert_eq!(tree.get(grandchild1).unwrap(), &2);
  625. assert_eq!(tree.get(child2).unwrap(), &1);
  626. assert_eq!(tree.get(grandchild2).unwrap(), &2);
  627. }
  628. #[test]
  629. fn up_pass() {
  630. use crate::tree::{Tree, TreeLike};
  631. // Tree before:
  632. // 0=\
  633. // 0=\
  634. // 1
  635. // 0=\
  636. // 1
  637. // Tree after:
  638. // 2=\
  639. // 1=\
  640. // 1
  641. // 1=\
  642. // 1
  643. let mut tree = Tree::new(0);
  644. let parent = tree.root();
  645. let child1 = tree.create_node(0);
  646. tree.add_child(parent, child1);
  647. let grandchild1 = tree.create_node(1);
  648. tree.add_child(child1, grandchild1);
  649. let child2 = tree.create_node(0);
  650. tree.add_child(parent, child2);
  651. let grandchild2 = tree.create_node(1);
  652. tree.add_child(child2, grandchild2);
  653. struct AddPass;
  654. impl Pass for AddPass {
  655. fn pass_id(&self) -> PassId {
  656. PassId(0)
  657. }
  658. fn dependancies(&self) -> &'static [PassId] {
  659. &[]
  660. }
  661. fn dependants(&self) -> &'static [PassId] {
  662. &[]
  663. }
  664. fn mask(&self) -> MemberMask {
  665. MemberMask(0)
  666. }
  667. }
  668. impl UpwardPass<i32> for AddPass {
  669. fn pass<'a>(
  670. &self,
  671. node: &mut i32,
  672. children: &mut dyn Iterator<Item = &'a mut i32>,
  673. _: &SendAnyMap,
  674. ) -> PassReturn {
  675. *node += children.map(|i| *i).sum::<i32>();
  676. PassReturn {
  677. progress: true,
  678. mark_dirty: true,
  679. }
  680. }
  681. }
  682. let add_pass = AnyPass::Upward(&AddPass);
  683. let passes = vec![&add_pass];
  684. let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  685. dirty_nodes.insert(PassId(0), grandchild1);
  686. dirty_nodes.insert(PassId(0), grandchild2);
  687. resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  688. assert_eq!(tree.get(tree.root()).unwrap(), &2);
  689. assert_eq!(tree.get(child1).unwrap(), &1);
  690. assert_eq!(tree.get(grandchild1).unwrap(), &1);
  691. assert_eq!(tree.get(child2).unwrap(), &1);
  692. assert_eq!(tree.get(grandchild2).unwrap(), &1);
  693. }
  694. #[test]
  695. fn dependant_up_pass() {
  696. use crate::tree::{Tree, TreeLike};
  697. // 0
  698. let mut tree = Tree::new(0);
  699. let parent = tree.root();
  700. // 1
  701. let child1 = tree.create_node(0);
  702. tree.add_child(parent, child1);
  703. // 2
  704. let grandchild1 = tree.create_node(1);
  705. tree.add_child(child1, grandchild1);
  706. // 3
  707. let child2 = tree.create_node(0);
  708. tree.add_child(parent, child2);
  709. // 4
  710. let grandchild2 = tree.create_node(1);
  711. tree.add_child(child2, grandchild2);
  712. struct AddPass;
  713. impl Pass for AddPass {
  714. fn pass_id(&self) -> PassId {
  715. PassId(0)
  716. }
  717. fn dependancies(&self) -> &'static [PassId] {
  718. &[PassId(1)]
  719. }
  720. fn dependants(&self) -> &'static [PassId] {
  721. &[]
  722. }
  723. fn mask(&self) -> MemberMask {
  724. MemberMask(0)
  725. }
  726. }
  727. impl UpwardPass<i32> for AddPass {
  728. fn pass<'a>(
  729. &self,
  730. node: &mut i32,
  731. children: &mut dyn Iterator<Item = &'a mut i32>,
  732. _: &SendAnyMap,
  733. ) -> PassReturn {
  734. *node += children.map(|i| *i).sum::<i32>();
  735. PassReturn {
  736. progress: true,
  737. mark_dirty: true,
  738. }
  739. }
  740. }
  741. struct SubtractPass;
  742. impl Pass for SubtractPass {
  743. fn pass_id(&self) -> PassId {
  744. PassId(1)
  745. }
  746. fn dependancies(&self) -> &'static [PassId] {
  747. &[]
  748. }
  749. fn dependants(&self) -> &'static [PassId] {
  750. &[PassId(0)]
  751. }
  752. fn mask(&self) -> MemberMask {
  753. MemberMask(0)
  754. }
  755. }
  756. impl UpwardPass<i32> for SubtractPass {
  757. fn pass<'a>(
  758. &self,
  759. node: &mut i32,
  760. children: &mut dyn Iterator<Item = &'a mut i32>,
  761. _: &SendAnyMap,
  762. ) -> PassReturn {
  763. *node -= children.map(|i| *i).sum::<i32>();
  764. PassReturn {
  765. progress: true,
  766. mark_dirty: true,
  767. }
  768. }
  769. }
  770. let add_pass = AnyPass::Upward(&AddPass);
  771. let subtract_pass = AnyPass::Upward(&SubtractPass);
  772. let passes = vec![&add_pass, &subtract_pass];
  773. let dirty_nodes: DirtyNodeStates = DirtyNodeStates::default();
  774. dirty_nodes.insert(PassId(1), grandchild1);
  775. dirty_nodes.insert(PassId(1), grandchild2);
  776. resolve_passes(&mut tree, dirty_nodes, passes, SendAnyMap::new());
  777. // Tree before:
  778. // 0=\
  779. // 0=\
  780. // 1
  781. // 0=\
  782. // 1
  783. // Tree after subtract:
  784. // 2=\
  785. // -1=\
  786. // 1
  787. // -1=\
  788. // 1
  789. // Tree after add:
  790. // 2=\
  791. // 0=\
  792. // 1
  793. // 0=\
  794. // 1
  795. assert_eq!(tree.get(tree.root()).unwrap(), &2);
  796. assert_eq!(tree.get(child1).unwrap(), &0);
  797. assert_eq!(tree.get(grandchild1).unwrap(), &1);
  798. assert_eq!(tree.get(child2).unwrap(), &0);
  799. assert_eq!(tree.get(grandchild2).unwrap(), &1);
  800. }