3 use std::ops::{Deref, DerefMut};
6 struct DerefCounter<T> {
7 count_imm: Cell<usize>,
12 impl<T> DerefCounter<T> {
13 fn new(value: T) -> DerefCounter<T> {
15 count_imm: Cell::new(0),
21 fn counts(&self) -> (usize, usize) {
22 (self.count_imm.get(), self.count_mut)
26 impl<T> Deref for DerefCounter<T> {
29 fn deref(&self) -> &T {
30 self.count_imm.set(self.count_imm.get() + 1);
35 impl<T> DerefMut for DerefCounter<T> {
36 fn deref_mut(&mut self) -> &mut T {
42 #[derive(PartialEq, Debug)]
49 fn get(&self) -> (isize, isize) {
55 let mut p = DerefCounter::new(Point {x: 0, y: 0});
58 assert_eq!(p.counts(), (1, 0));
61 assert_eq!(p.counts(), (2, 0));
64 assert_eq!(p.counts(), (2, 1));
67 assert_eq!(p.counts(), (2, 2));
70 assert_eq!(p.counts(), (3, 2));
72 // Check the final state.
73 assert_eq!(*p, Point {x: 3, y: 0});