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