| //@ revisions: lib usage |
| //@[lib] compile-flags: --crate-type=lib |
| //@[lib] build-pass |
| |
| use std::ops::Sub; |
| trait Vector2 { |
| type ScalarType; |
| |
| fn from_values(x: Self::ScalarType, y: Self::ScalarType) -> Self |
| where |
| Self: Sized; |
| |
| fn x(&self) -> Self::ScalarType; |
| fn y(&self) -> Self::ScalarType; |
| } |
| |
| impl<T> Sub for dyn Vector2<ScalarType = T> |
| where |
| T: Sub<Output = T>, |
| (dyn Vector2<ScalarType = T>): Sized, |
| { |
| type Output = dyn Vector2<ScalarType = T>; |
| |
| fn sub(self, rhs: Self) -> Self::Output { |
| Self::from_values(self.x() - rhs.x(), self.y() - rhs.y()) |
| } |
| } |
| |
| struct Vec2 { |
| x: i32, |
| y: i32, |
| } |
| |
| impl Vector2 for Vec2 { |
| type ScalarType = i32; |
| |
| fn from_values(x: Self::ScalarType, y: Self::ScalarType) -> Self |
| where |
| Self: Sized, |
| { |
| Self { x, y } |
| } |
| |
| fn x(&self) -> Self::ScalarType { |
| self.x |
| } |
| fn y(&self) -> Self::ScalarType { |
| self.y |
| } |
| } |
| |
| #[cfg(usage)] |
| fn main() { |
| let hey: Box<dyn Vector2<ScalarType = i32>> = Box::new(Vec2 { x: 1, y: 2 }); |
| let word: Box<dyn Vector2<ScalarType = i32>> = Box::new(Vec2 { x: 1, y: 2 }); |
| |
| let bar = *hey - *word; |
| //[usage]~^ ERROR cannot subtract |
| } |