1 // run-pass
2 use std::ops::{Deref, DerefMut};
3
4 struct CheckedDeref<T, F> {
5 value: T,
6 check: F
7 }
8
9 impl<F: Fn(&T) -> bool, T> Deref for CheckedDeref<T, F> {
10 type Target = T;
deref(&self) -> &T11 fn deref(&self) -> &T {
12 assert!((self.check)(&self.value));
13 &self.value
14 }
15 }
16
17 impl<F: Fn(&T) -> bool, T> DerefMut for CheckedDeref<T, F> {
deref_mut(&mut self) -> &mut T18 fn deref_mut(&mut self) -> &mut T {
19 assert!((self.check)(&self.value));
20 &mut self.value
21 }
22 }
23
24
main()25 fn main() {
26 let mut v = CheckedDeref {
27 value: vec![0],
28 check: |v: &Vec<_>| !v.is_empty()
29 };
30 v.push(1);
31 assert_eq!(*v, vec![0, 1]);
32 }
33