Advertisement
mwchase

LC:NN upload 5b

Apr 2nd, 2017
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 2.19 KB | None | 0 0
  1. diff --git a/rust/q_sequence/src/main.rs b/rust/q_sequence/src/main.rs
  2. new file mode 100644
  3. --- /dev/null
  4. +++ b/rust/q_sequence/src/main.rs
  5. @@ -0,0 +1,59 @@
  6. +use std::collections::HashMap;
  7. +use std::sync::{Arc,RwLock};
  8. +use std::thread;
  9. +
  10. +fn poll_for(mapping: Arc<RwLock<HashMap<i32, Arc<RwLock<i32>>>>>, key: i32) -> Arc<RwLock<i32>> {
  11. +    loop {
  12. +        match mapping.read().unwrap().get(&key) {
  13. +            Some(i) => return i.clone(),
  14. +            None => ()
  15. +        }
  16. +    }
  17. +}
  18. +
  19. +fn q(mapping: &mut Arc<RwLock<HashMap<i32, Arc<RwLock<i32>>>>>, key: i32) -> i32 {
  20. +    println!("Running for {:?}", key);
  21. +    {
  22. +        match mapping.read().unwrap().get(&key) {
  23. +            Some(i) => return *i.read().unwrap(),
  24. +            None => ()
  25. +        }
  26. +    }
  27. +    {
  28. +        println!("Generating for {:?}", key);
  29. +        let lock = Arc::new(RwLock::new(0));
  30. +        let mut val = lock.write().unwrap();
  31. +        {
  32. +            use std::collections::hash_map::Entry::*;
  33. +            let mut mutable_mapping = mapping.write().unwrap();
  34. +            match mutable_mapping.entry(key) {
  35. +                Occupied(entry) => return *entry.get().read().unwrap(),
  36. +                Vacant(entry) => {entry.insert(lock.clone());}
  37. +            }
  38. +            println!("Inserted for {:?}", key);
  39. +        }
  40. +        {
  41. +            let mut _mapping = mapping.clone();
  42. +            thread::spawn(move || {
  43. +                q(&mut _mapping, key - 1);
  44. +            });
  45. +        }
  46. +        {
  47. +            let prev = poll_for(mapping.clone(), key - 1);
  48. +            let prev_prev = poll_for(mapping.clone(), key - 2);
  49. +            let first = poll_for(mapping.clone(), key - *prev.read().unwrap());
  50. +            let second = poll_for(mapping.clone(), key - *prev_prev.read().unwrap());
  51. +            *val = *first.read().unwrap() + *second.read().unwrap();
  52. +        }
  53. +        *val
  54. +    }
  55. +}
  56. +
  57. +fn main() {
  58. +    let mut mapping = HashMap::new();
  59. +    mapping.insert(1, Arc::new(RwLock::new(1)));
  60. +    mapping.insert(2, Arc::new(RwLock::new(1)));
  61. +    let mut mapping = Arc::new(RwLock::new(mapping));
  62. +    println!("{:?}", q(&mut mapping, 10));
  63. +    println!("{:?}", q(&mut mapping, 10));
  64. +}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement