Guest User

Untitled

a guest
Jun 18th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. #![allow(dead_code)]
  2. #![allow(unused_imports)]
  3.  
  4. fn recurse<X, Y>(x: X, f: &mut FnMut(X, &mut FnMut(X) -> Y) -> Y) -> Y {
  5. let fp = f as *mut FnMut(X, &mut FnMut(X) -> Y) -> Y;
  6. let f1 = unsafe { &mut *fp };
  7. let f2 = unsafe { &mut *fp };
  8. f1(x, &mut |x: X| recurse(x, f2))
  9. }
  10.  
  11. #[cfg(test)]
  12. mod tests {
  13. use super::*;
  14.  
  15. fn graph() -> Vec<Vec<usize>> {
  16. //
  17. // 0 -- 1
  18. // | \
  19. // | \
  20. // 2 -- 3 4--5
  21. //
  22. vec![
  23. vec![1, 2, 3],
  24. vec![0],
  25. vec![0, 3],
  26. vec![0, 2],
  27. vec![5],
  28. vec![4],
  29. ]
  30. }
  31.  
  32. #[test]
  33. fn test_fact() {
  34. let fact = |n| recurse(n, &mut |n, fact| if n <= 1 { 1 } else { n * fact(n - 1) });
  35. assert_eq!(fact(1), 1);
  36. assert_eq!(fact(5), 120);
  37. }
  38.  
  39. #[test]
  40. fn test_dfs() {
  41. let graph = graph();
  42. let n = graph.len();
  43.  
  44. let mut roots = vec![n; n];
  45. for u in 0..n {
  46. recurse(u, &mut |v, go| {
  47. if roots[v] < n {
  48. return;
  49. }
  50.  
  51. roots[v] = u;
  52.  
  53. for &w in graph[v].iter() {
  54. go(w);
  55. }
  56. })
  57. }
  58.  
  59. assert_eq!(roots, vec![0, 0, 0, 0, 4, 4]);
  60. }
  61.  
  62. #[test]
  63. fn test_closure_is_dropped() {
  64. let n = 4;
  65. let mut k = 0;
  66. struct D<'a>(pub &'a mut i32);
  67. impl<'a> Drop for D<'a> {
  68. fn drop(&mut self) {
  69. *self.0 += 1;
  70. }
  71. }
  72.  
  73. {
  74. recurse(0, &mut |i, go| {
  75. let d = D(&mut k);
  76.  
  77. if i >= n {
  78. assert_eq!(*d.0, 0);
  79. return;
  80. }
  81.  
  82. go(i + 1);
  83. });
  84. }
  85.  
  86. assert_eq!(k, n + 1);
  87. }
  88. }
Add Comment
Please, Sign In to add comment