/// `neg`, and therefore, `main` prints `Negating!`.
///
/// ```
+/// #![feature(associated_types)]
+///
/// use std::ops::Neg;
///
/// struct Foo;
///
/// impl Copy for Foo {}
///
-/// impl Neg<Foo> for Foo {
+/// impl Neg for Foo {
+/// type Output = Foo;
+///
/// fn neg(self) -> Foo {
/// println!("Negating!");
/// self
/// }
/// ```
#[lang="neg"]
-pub trait Neg<Result> {
+pub trait Neg {
+ type Output;
+
/// The method for the unary `-` operator
- fn neg(self) -> Result;
+ fn neg(self) -> Self::Output;
}
macro_rules! neg_impl {
($($t:ty)*) => ($(
- impl Neg<$t> for $t {
+ impl Neg for $t {
+ type Output = $t;
+
#[inline]
fn neg(self) -> $t { -self }
}
macro_rules! neg_uint_impl {
($t:ty, $t_signed:ty) => {
- impl Neg<$t> for $t {
+ impl Neg for $t {
+ type Output = $t;
+
#[inline]
fn neg(self) -> $t { -(self as $t_signed) as $t }
}
/// `not`, and therefore, `main` prints `Not-ing!`.
///
/// ```
+/// #![feature(associated_types)]
+///
/// use std::ops::Not;
///
/// struct Foo;
///
/// impl Copy for Foo {}
///
-/// impl Not<Foo> for Foo {
+/// impl Not for Foo {
+/// type Output = Foo;
+///
/// fn not(self) -> Foo {
/// println!("Not-ing!");
/// self
/// }
/// ```
#[lang="not"]
-pub trait Not<Result> {
+pub trait Not {
+ type Output;
+
/// The method for the unary `!` operator
- fn not(self) -> Result;
+ fn not(self) -> Self::Output;
}
macro_rules! not_impl {
($($t:ty)*) => ($(
- impl Not<$t> for $t {
+ impl Not for $t {
+ type Output = $t;
+
#[inline]
fn not(self) -> $t { !self }
}