| #![feature(specialization)] |
| |
| // Common code used for tests that model the Fn/FnMut/FnOnce hierarchy. |
| |
| pub trait Go { |
| fn go(&self, arg: isize); |
| } |
| |
| pub fn go<G:Go>(this: &G, arg: isize) { |
| this.go(arg) |
| } |
| |
| pub trait GoMut { |
| fn go_mut(&mut self, arg: isize); |
| } |
| |
| pub fn go_mut<G:GoMut>(this: &mut G, arg: isize) { |
| this.go_mut(arg) |
| } |
| |
| pub trait GoOnce { |
| fn go_once(self, arg: isize); |
| } |
| |
| pub fn go_once<G:GoOnce>(this: G, arg: isize) { |
| this.go_once(arg) |
| } |
| |
| impl<G> GoMut for G |
| where G : Go |
| { |
| default fn go_mut(&mut self, arg: isize) { |
| go(&*self, arg) |
| } |
| } |
| |
| impl<G> GoOnce for G |
| where G : GoMut |
| { |
| default fn go_once(mut self, arg: isize) { |
| go_mut(&mut self, arg) |
| } |
| } |