Skip to content

Commit

Permalink
use assoc types in unop traits
Browse files Browse the repository at this point in the history
  • Loading branch information
Jorge Aparicio committed Jan 3, 2015
1 parent 9e8a187 commit 9fde578
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 20 deletions.
8 changes: 4 additions & 4 deletions src/libcore/num/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ pub trait Int
+ Mul<Output=Self>
+ Div<Output=Self>
+ Rem<Output=Self>
+ Not<Self>
+ Not<Output=Self>
+ BitAnd<Output=Self>
+ BitOr<Output=Self>
+ BitXor<Output=Self>
Expand Down Expand Up @@ -613,7 +613,7 @@ int_impl! { int = i64, u64, 64,
#[unstable = "recently settled as part of numerics reform"]
pub trait SignedInt
: Int
+ Neg<Self>
+ Neg<Output=Self>
{
/// Computes the absolute value of `self`. `Int::min_value()` will be
/// returned if the number is `Int::min_value()`.
Expand Down Expand Up @@ -1245,7 +1245,7 @@ pub trait Float
+ NumCast
+ PartialOrd
+ PartialEq
+ Neg<Self>
+ Neg<Output=Self>
+ Add<Output=Self>
+ Sub<Output=Self>
+ Mul<Output=Self>
Expand Down Expand Up @@ -1718,7 +1718,7 @@ macro_rules! trait_impl {
#[deprecated = "Generalised numbers are no longer supported"]
#[allow(deprecated)]
pub trait Num: PartialEq + Zero + One
+ Neg<Self>
+ Neg<Output=Self>
+ Add<Output=Self>
+ Sub<Output=Self>
+ Mul<Output=Self>
Expand Down
36 changes: 27 additions & 9 deletions src/libcore/ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -360,13 +360,17 @@ rem_float_impl! { f64, fmod }
/// `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
Expand All @@ -378,14 +382,18 @@ rem_float_impl! { f64, fmod }
/// }
/// ```
#[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 }
}
Expand All @@ -394,7 +402,9 @@ macro_rules! neg_impl {

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 }
}
Expand All @@ -418,13 +428,17 @@ neg_uint_impl! { u64, i64 }
/// `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
Expand All @@ -436,14 +450,18 @@ neg_uint_impl! { u64, i64 }
/// }
/// ```
#[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 }
}
Expand Down
4 changes: 3 additions & 1 deletion src/libstd/bitflags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,9 @@ macro_rules! bitflags {
}
}

impl ::std::ops::Not<$BitFlags> for $BitFlags {
impl ::std::ops::Not for $BitFlags {
type Output = $BitFlags;

/// Returns the complement of this set of flags.
#[inline]
fn not(self) -> $BitFlags {
Expand Down
4 changes: 3 additions & 1 deletion src/libstd/time/duration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,9 @@ impl Duration {
}
}

impl Neg<Duration> for Duration {
impl Neg for Duration {
type Output = Duration;

#[inline]
fn neg(self) -> Duration {
if self.nanos == 0 {
Expand Down
6 changes: 3 additions & 3 deletions src/test/compile-fail/unop-move-semantics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@

use std::ops::Not;

fn move_then_borrow<T: Not<T> + Clone>(x: T) {
fn move_then_borrow<T: Not<Output=T> + Clone>(x: T) {
!x;

x.clone(); //~ ERROR: use of moved value
}

fn move_borrowed<T: Not<T>>(x: T, mut y: T) {
fn move_borrowed<T: Not<Output=T>>(x: T, mut y: T) {
let m = &x;
let n = &mut y;

Expand All @@ -27,7 +27,7 @@ fn move_borrowed<T: Not<T>>(x: T, mut y: T) {
!y; //~ ERROR: cannot move out of `y` because it is borrowed
}

fn illegal_dereference<T: Not<T>>(mut x: T, y: T) {
fn illegal_dereference<T: Not<Output=T>>(mut x: T, y: T) {
let m = &mut x;
let n = &y;

Expand Down
8 changes: 6 additions & 2 deletions src/test/run-pass/operator-overloading.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,17 @@ impl ops::Sub for Point {
}
}

impl ops::Neg<Point> for Point {
impl ops::Neg for Point {
type Output = Point;

fn neg(self) -> Point {
Point {x: -self.x, y: -self.y}
}
}

impl ops::Not<Point> for Point {
impl ops::Not for Point {
type Output = Point;

fn not(self) -> Point {
Point {x: !self.x, y: !self.y }
}
Expand Down

0 comments on commit 9fde578

Please sign in to comment.