Guest User

Untitled

a guest
Dec 10th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.13 KB | None | 0 0
  1. #[derive(Debug)]
  2. struct List<T> {
  3. elem: T,
  4. next: Option<Box<List<T>>>,
  5. }
  6.  
  7. #[derive(Debug)]
  8. struct Queue<T> {
  9. tail: Option<Box<List<T>>>,
  10. head: *mut Option<Box<List<T>>>,
  11. }
  12.  
  13. impl<T> Queue<T> {
  14. fn new() -> Queue<T> {
  15. let mut tail = None;
  16. let head = &mut tail as *mut Option<Box<List<T>>>;
  17. Queue{tail, head}
  18. }
  19.  
  20. fn push(&mut self, elem: T) {
  21. let mut new_elem = None;
  22. let ptr = &mut new_elem as *mut Option<Box<List<T>>>;
  23. unsafe {
  24. (*(self.head)).replace(Box::new(List{elem, next: new_elem}));
  25. }
  26. self.head = ptr;
  27. }
  28. }
  29.  
  30. impl<T> Iterator for Queue<T> {
  31. type Item = T;
  32. fn next(&mut self) -> Option<T> {
  33. match self.tail.take() {
  34. Some(l) => {
  35. self.tail = l.next;
  36. Some(l.elem)
  37. },
  38. None => None,
  39. }
  40. }
  41. }
  42.  
  43. fn main() {
  44. let mut q = Queue::<i32>::new();
  45. let ptr : *mut Option<Box<List<i32>>> = &mut q.tail;
  46. assert_eq!(q.head, ptr);
  47. q.push(1);
  48. q.push(2);
  49. println!("{}", q.tail.unwrap().elem);
  50. //for i in q {
  51. // println!("{}", i);
  52. //}
  53. }
Add Comment
Please, Sign In to add comment