]> git.lizzy.rs Git - rust.git/blob - src/test/ui/overloaded/overloaded-autoderef-count.rs
Rollup merge of #105955 - Nilstrieb:no-trivial-opt-wrappers-we-have-field-accesses...
[rust.git] / src / test / ui / overloaded / overloaded-autoderef-count.rs
1 // run-pass
2 use std::cell::Cell;
3 use std::ops::{Deref, DerefMut};
4
5 #[derive(PartialEq)]
6 struct DerefCounter<T> {
7     count_imm: Cell<usize>,
8     count_mut: usize,
9     value: T
10 }
11
12 impl<T> DerefCounter<T> {
13     fn new(value: T) -> DerefCounter<T> {
14         DerefCounter {
15             count_imm: Cell::new(0),
16             count_mut: 0,
17             value: value
18         }
19     }
20
21     fn counts(&self) -> (usize, usize) {
22         (self.count_imm.get(), self.count_mut)
23     }
24 }
25
26 impl<T> Deref for DerefCounter<T> {
27     type Target = T;
28
29     fn deref(&self) -> &T {
30         self.count_imm.set(self.count_imm.get() + 1);
31         &self.value
32     }
33 }
34
35 impl<T> DerefMut for DerefCounter<T> {
36     fn deref_mut(&mut self) -> &mut T {
37         self.count_mut += 1;
38         &mut self.value
39     }
40 }
41
42 #[derive(PartialEq, Debug)]
43 struct Point {
44     x: isize,
45     y: isize
46 }
47
48 impl Point {
49     fn get(&self) -> (isize, isize) {
50         (self.x, self.y)
51     }
52 }
53
54 pub fn main() {
55     let mut p = DerefCounter::new(Point {x: 0, y: 0});
56
57     let _ = p.x;
58     assert_eq!(p.counts(), (1, 0));
59
60     let _ = &p.x;
61     assert_eq!(p.counts(), (2, 0));
62
63     let _ = &mut p.y;
64     assert_eq!(p.counts(), (2, 1));
65
66     p.x += 3;
67     assert_eq!(p.counts(), (2, 2));
68
69     p.get();
70     assert_eq!(p.counts(), (3, 2));
71
72     // Check the final state.
73     assert_eq!(*p, Point {x: 3, y: 0});
74 }