]> git.lizzy.rs Git - rust.git/blob - tests/run-pass/vecdeque.rs
test VecDeque::iter_mut aliasing
[rust.git] / tests / run-pass / vecdeque.rs
1 use std::collections::VecDeque;
2
3 fn test_all_refs<'a, T: 'a>(dummy: &mut T, iter: impl Iterator<Item = &'a mut T>) {
4     // Gather all those references.
5     let mut refs: Vec<&mut T> = iter.collect();
6     // Use them all. Twice, to be sure we got all interleavings.
7     for r in refs.iter_mut() {
8         std::mem::swap(dummy, r);
9     }
10     for r in refs {
11         std::mem::swap(dummy, r);
12     }
13 }
14
15 fn main() {
16     let mut dst = VecDeque::new();
17     dst.push_front(Box::new(1));
18     dst.push_front(Box::new(2));
19     dst.pop_back();
20
21     let mut src = VecDeque::new();
22     src.push_front(Box::new(2));
23     dst.append(&mut src);
24     for a in dst.iter() {
25       assert_eq!(**a, 2);
26     }
27
28     // Regression test for Debug and Diaplay impl's
29     println!("{:?} {:?}", dst, dst.iter());
30     println!("{:?}", VecDeque::<u32>::new().iter());
31
32     for a in dst {
33         assert_eq!(*a, 2);
34     }
35
36     // # Aliasing tests.
37     let mut v = std::collections::VecDeque::new();
38     v.push_back(1);
39     v.push_back(2);
40
41     // Test `fold` bad aliasing.
42     let mut it = v.iter_mut();
43     let ref0 = it.next().unwrap();
44     let sum = it.fold(0, |x, y| x + *y);
45     assert_eq!(*ref0 + sum, 3);
46
47     // Test general iterator aliasing.
48     v.push_front(0);
49     test_all_refs(&mut 0, v.iter_mut());
50 }