2012-12-03 18:48:01 -06:00
|
|
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
|
|
|
// file at the top-level directory of this distribution and at
|
|
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2014-11-25 20:17:11 -06:00
|
|
|
//! Overloadable operators
|
|
|
|
//!
|
|
|
|
//! Implementing these traits allows you to get an effect similar to
|
|
|
|
//! overloading operators.
|
|
|
|
//!
|
|
|
|
//! The values for the right hand side of an operator are automatically
|
|
|
|
//! borrowed, so `a + b` is sugar for `a.add(&b)`.
|
|
|
|
//!
|
|
|
|
//! All of these traits are imported by the prelude, so they are available in
|
|
|
|
//! every Rust program.
|
|
|
|
//!
|
|
|
|
//! # Example
|
|
|
|
//!
|
|
|
|
//! This example creates a `Point` struct that implements `Add` and `Sub`, and then
|
|
|
|
//! demonstrates adding and subtracting two `Point`s.
|
|
|
|
//!
|
|
|
|
//! ```rust
|
|
|
|
//! #[deriving(Show)]
|
|
|
|
//! struct Point {
|
|
|
|
//! x: int,
|
|
|
|
//! y: int
|
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! impl Add<Point, Point> for Point {
|
2014-12-01 18:10:12 -06:00
|
|
|
//! fn add(self, other: Point) -> Point {
|
2014-11-25 20:17:11 -06:00
|
|
|
//! Point {x: self.x + other.x, y: self.y + other.y}
|
|
|
|
//! }
|
|
|
|
//! }
|
|
|
|
//!
|
|
|
|
//! impl Sub<Point, Point> for Point {
|
2014-12-01 18:10:12 -06:00
|
|
|
//! fn sub(self, other: Point) -> Point {
|
2014-11-25 20:17:11 -06:00
|
|
|
//! Point {x: self.x - other.x, y: self.y - other.y}
|
|
|
|
//! }
|
|
|
|
//! }
|
|
|
|
//! fn main() {
|
|
|
|
//! println!("{}", Point {x: 1, y: 0} + Point {x: 2, y: 3});
|
|
|
|
//! println!("{}", Point {x: 1, y: 0} - Point {x: 2, y: 3});
|
|
|
|
//! }
|
|
|
|
//! ```
|
|
|
|
//!
|
|
|
|
//! See the documentation for each trait for a minimum implementation that prints
|
|
|
|
//! something to the screen.
|
2013-09-26 07:54:48 -05:00
|
|
|
|
2014-09-05 00:10:32 -05:00
|
|
|
use kinds::Sized;
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Drop` trait is used to run some code when a value goes out of scope. This
|
|
|
|
/// is sometimes called a 'destructor'.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Drop`. The `drop` method is called when `_x` goes
|
|
|
|
/// out of scope, and therefore `main` prints `Dropping!`.
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// struct HasDrop;
|
|
|
|
///
|
|
|
|
/// impl Drop for HasDrop {
|
|
|
|
/// fn drop(&mut self) {
|
|
|
|
/// println!("Dropping!");
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// let _x = HasDrop;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2012-11-05 19:50:01 -06:00
|
|
|
#[lang="drop"]
|
|
|
|
pub trait Drop {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The `drop` method, called when the value goes out of scope.
|
2013-09-16 20:18:07 -05:00
|
|
|
fn drop(&mut self);
|
2012-11-05 19:50:01 -06:00
|
|
|
}
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Add` trait is used to specify the functionality of `+`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Add`. When `Foo + Foo` happens, it ends up
|
|
|
|
/// calling `add`, and therefore, `main` prints `Adding!`.
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Add<Foo, Foo> for Foo {
|
|
|
|
/// fn add(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Adding!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo + Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-11-28 15:51:50 -06:00
|
|
|
#[lang="add"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Add<Sized? RHS,Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `+` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn add(&self, rhs: &RHS) -> Result;
|
2012-11-28 15:51:50 -06:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! add_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Add<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn add(&self, other: &$t) -> $t { (*self) + (*other) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `Add` trait is used to specify the functionality of `+`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Add`. When `Foo + Foo` happens, it ends up
|
|
|
|
/// calling `add`, and therefore, `main` prints `Adding!`.
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl Add<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn add(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Adding!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo + Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="add"]
|
|
|
|
pub trait Add<RHS, Result> {
|
|
|
|
/// The method for the `+` operator
|
|
|
|
fn add(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! add_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Add<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn add(self, other: $t) -> $t { self + other }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
add_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64 f32 f64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Sub` trait is used to specify the functionality of `-`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Sub`. When `Foo - Foo` happens, it ends up
|
|
|
|
/// calling `sub`, and therefore, `main` prints `Subtracting!`.
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Sub<Foo, Foo> for Foo {
|
|
|
|
/// fn sub(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Subtracting!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo - Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="sub"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Sub<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `-` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn sub(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! sub_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Sub<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn sub(&self, other: &$t) -> $t { (*self) - (*other) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `Sub` trait is used to specify the functionality of `-`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Sub`. When `Foo - Foo` happens, it ends up
|
|
|
|
/// calling `sub`, and therefore, `main` prints `Subtracting!`.
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl Sub<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn sub(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Subtracting!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo - Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="sub"]
|
|
|
|
pub trait Sub<RHS, Result> {
|
|
|
|
/// The method for the `-` operator
|
|
|
|
fn sub(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! sub_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Sub<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn sub(self, other: $t) -> $t { self - other }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
sub_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64 f32 f64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Mul` trait is used to specify the functionality of `*`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Mul`. When `Foo * Foo` happens, it ends up
|
|
|
|
/// calling `mul`, and therefore, `main` prints `Multiplying!`.
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Mul<Foo, Foo> for Foo {
|
|
|
|
/// fn mul(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Multiplying!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo * Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="mul"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Mul<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `*` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn mul(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! mul_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Mul<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn mul(&self, other: &$t) -> $t { (*self) * (*other) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `Mul` trait is used to specify the functionality of `*`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Mul`. When `Foo * Foo` happens, it ends up
|
|
|
|
/// calling `mul`, and therefore, `main` prints `Multiplying!`.
|
|
|
|
///
|
|
|
|
/// ```rust
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl Mul<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn mul(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Multiplying!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo * Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="mul"]
|
|
|
|
pub trait Mul<RHS, Result> {
|
|
|
|
/// The method for the `*` operator
|
|
|
|
fn mul(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! mul_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Mul<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn mul(self, other: $t) -> $t { self * other }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
mul_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64 f32 f64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Div` trait is used to specify the functionality of `/`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Div`. When `Foo / Foo` happens, it ends up
|
|
|
|
/// calling `div`, and therefore, `main` prints `Dividing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Div<Foo, Foo> for Foo {
|
|
|
|
/// fn div(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Dividing!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo / Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="div"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Div<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `/` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn div(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! div_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Div<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn div(&self, other: &$t) -> $t { (*self) / (*other) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `Div` trait is used to specify the functionality of `/`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Div`. When `Foo / Foo` happens, it ends up
|
|
|
|
/// calling `div`, and therefore, `main` prints `Dividing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl Div<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn div(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Dividing!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo / Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="div"]
|
|
|
|
pub trait Div<RHS, Result> {
|
|
|
|
/// The method for the `/` operator
|
|
|
|
fn div(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! div_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Div<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn div(self, other: $t) -> $t { self / other }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
div_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64 f32 f64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Rem` trait is used to specify the functionality of `%`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Rem`. When `Foo % Foo` happens, it ends up
|
|
|
|
/// calling `rem`, and therefore, `main` prints `Remainder-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Rem<Foo, Foo> for Foo {
|
|
|
|
/// fn rem(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Remainder-ing!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo % Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2013-04-21 10:58:53 -05:00
|
|
|
#[lang="rem"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Rem<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `%` operator
|
2013-04-21 10:58:53 -05:00
|
|
|
fn rem(&self, rhs: &RHS) -> Result;
|
|
|
|
}
|
2012-09-19 20:00:26 -05:00
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! rem_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Rem<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn rem(&self, other: &$t) -> $t { (*self) % (*other) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! rem_float_impl(
|
|
|
|
($t:ty, $fmod:ident) => {
|
|
|
|
impl Rem<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn rem(&self, other: &$t) -> $t {
|
|
|
|
extern { fn $fmod(a: $t, b: $t) -> $t; }
|
|
|
|
unsafe { $fmod(*self, *other) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `Rem` trait is used to specify the functionality of `%`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Rem`. When `Foo % Foo` happens, it ends up
|
|
|
|
/// calling `rem`, and therefore, `main` prints `Remainder-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl Rem<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn rem(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Remainder-ing!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo % Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="rem"]
|
|
|
|
pub trait Rem<RHS, Result> {
|
|
|
|
/// The method for the `%` operator
|
|
|
|
fn rem(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! rem_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Rem<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn rem(self, other: $t) -> $t { self % other }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! rem_float_impl(
|
|
|
|
($t:ty, $fmod:ident) => {
|
|
|
|
impl Rem<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn rem(self, other: $t) -> $t {
|
|
|
|
extern { fn $fmod(a: $t, b: $t) -> $t; }
|
|
|
|
unsafe { $fmod(self, other) }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
rem_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64)
|
|
|
|
rem_float_impl!(f32, fmodf)
|
|
|
|
rem_float_impl!(f64, fmod)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Neg` trait is used to specify the functionality of unary `-`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Neg`. When `-Foo` happens, it ends up calling
|
|
|
|
/// `neg`, and therefore, `main` prints `Negating!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Neg<Foo> for Foo {
|
|
|
|
/// fn neg(&self) -> Foo {
|
|
|
|
/// println!("Negating!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// -Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2012-07-25 21:03:55 -05:00
|
|
|
#[lang="neg"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Neg<Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the unary `-` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn neg(&self) -> Result;
|
2012-07-25 21:03:55 -05:00
|
|
|
}
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! neg_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Neg<$t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn neg(&self) -> $t { -*self }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
|
|
|
macro_rules! neg_uint_impl(
|
|
|
|
($t:ty, $t_signed:ty) => {
|
|
|
|
impl Neg<$t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn neg(&self) -> $t { -(*self as $t_signed) as $t }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
neg_impl!(int i8 i16 i32 i64 f32 f64)
|
|
|
|
|
|
|
|
neg_uint_impl!(uint, int)
|
|
|
|
neg_uint_impl!(u8, i8)
|
|
|
|
neg_uint_impl!(u16, i16)
|
|
|
|
neg_uint_impl!(u32, i32)
|
|
|
|
neg_uint_impl!(u64, i64)
|
|
|
|
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Not` trait is used to specify the functionality of unary `!`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Not`. When `!Foo` happens, it ends up calling
|
|
|
|
/// `not`, and therefore, `main` prints `Not-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Not<Foo> for Foo {
|
|
|
|
/// fn not(&self) -> Foo {
|
|
|
|
/// println!("Not-ing!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// !Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2013-01-11 11:16:58 -06:00
|
|
|
#[lang="not"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Not<Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the unary `!` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn not(&self) -> Result;
|
2013-01-11 11:16:58 -06:00
|
|
|
}
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
|
|
|
|
macro_rules! not_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Not<$t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn not(&self) -> $t { !*self }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
|
|
|
not_impl!(bool uint u8 u16 u32 u64 int i8 i16 i32 i64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `BitAnd` trait is used to specify the functionality of `&`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `BitAnd`. When `Foo & Foo` happens, it ends up
|
|
|
|
/// calling `bitand`, and therefore, `main` prints `Bitwise And-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl BitAnd<Foo, Foo> for Foo {
|
|
|
|
/// fn bitand(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Bitwise And-ing!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo & Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="bitand"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait BitAnd<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `&` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn bitand(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! bitand_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl BitAnd<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn bitand(&self, rhs: &$t) -> $t { (*self) & (*rhs) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `BitAnd` trait is used to specify the functionality of `&`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `BitAnd`. When `Foo & Foo` happens, it ends up
|
|
|
|
/// calling `bitand`, and therefore, `main` prints `Bitwise And-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl BitAnd<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn bitand(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Bitwise And-ing!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo & Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="bitand"]
|
|
|
|
pub trait BitAnd<RHS, Result> {
|
|
|
|
/// The method for the `&` operator
|
|
|
|
fn bitand(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! bitand_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl BitAnd<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn bitand(self, rhs: $t) -> $t { self & rhs }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
bitand_impl!(bool uint u8 u16 u32 u64 int i8 i16 i32 i64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `BitOr` trait is used to specify the functionality of `|`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `BitOr`. When `Foo | Foo` happens, it ends up
|
|
|
|
/// calling `bitor`, and therefore, `main` prints `Bitwise Or-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl BitOr<Foo, Foo> for Foo {
|
|
|
|
/// fn bitor(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Bitwise Or-ing!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo | Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="bitor"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait BitOr<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `|` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn bitor(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! bitor_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl BitOr<$t,$t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn bitor(&self, rhs: &$t) -> $t { (*self) | (*rhs) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `BitOr` trait is used to specify the functionality of `|`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `BitOr`. When `Foo | Foo` happens, it ends up
|
|
|
|
/// calling `bitor`, and therefore, `main` prints `Bitwise Or-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl BitOr<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn bitor(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Bitwise Or-ing!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo | Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="bitor"]
|
|
|
|
pub trait BitOr<RHS, Result> {
|
|
|
|
/// The method for the `|` operator
|
|
|
|
fn bitor(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! bitor_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl BitOr<$t,$t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn bitor(self, rhs: $t) -> $t { self | rhs }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
bitor_impl!(bool uint u8 u16 u32 u64 int i8 i16 i32 i64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `BitXor` trait is used to specify the functionality of `^`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `BitXor`. When `Foo ^ Foo` happens, it ends up
|
|
|
|
/// calling `bitxor`, and therefore, `main` prints `Bitwise Xor-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl BitXor<Foo, Foo> for Foo {
|
|
|
|
/// fn bitxor(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Bitwise Xor-ing!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo ^ Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="bitxor"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait BitXor<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `^` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn bitxor(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! bitxor_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl BitXor<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn bitxor(&self, other: &$t) -> $t { (*self) ^ (*other) }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `BitXor` trait is used to specify the functionality of `^`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `BitXor`. When `Foo ^ Foo` happens, it ends up
|
|
|
|
/// calling `bitxor`, and therefore, `main` prints `Bitwise Xor-ing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl BitXor<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn bitxor(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Bitwise Xor-ing!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo ^ Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="bitxor"]
|
|
|
|
pub trait BitXor<RHS, Result> {
|
|
|
|
/// The method for the `^` operator
|
|
|
|
fn bitxor(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! bitxor_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl BitXor<$t, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn bitxor(self, other: $t) -> $t { self ^ other }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
bitxor_impl!(bool uint u8 u16 u32 u64 int i8 i16 i32 i64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Shl` trait is used to specify the functionality of `<<`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Shl`. When `Foo << Foo` happens, it ends up
|
|
|
|
/// calling `shl`, and therefore, `main` prints `Shifting left!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Shl<Foo, Foo> for Foo {
|
|
|
|
/// fn shl(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Shifting left!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo << Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="shl"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Shl<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `<<` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn shl(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! shl_impl(
|
|
|
|
($($t:ty)*) => ($(
|
2014-07-04 01:15:25 -05:00
|
|
|
impl Shl<uint, $t> for $t {
|
2014-04-21 16:58:52 -05:00
|
|
|
#[inline]
|
2014-07-04 01:15:25 -05:00
|
|
|
fn shl(&self, other: &uint) -> $t {
|
|
|
|
(*self) << (*other)
|
2014-04-21 16:58:52 -05:00
|
|
|
}
|
|
|
|
}
|
2014-05-26 12:33:04 -05:00
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `Shl` trait is used to specify the functionality of `<<`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Shl`. When `Foo << Foo` happens, it ends up
|
|
|
|
/// calling `shl`, and therefore, `main` prints `Shifting left!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl Shl<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn shl(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Shifting left!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo << Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="shl"]
|
|
|
|
pub trait Shl<RHS, Result> {
|
|
|
|
/// The method for the `<<` operator
|
|
|
|
fn shl(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! shl_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Shl<uint, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn shl(self, other: uint) -> $t {
|
|
|
|
self << other
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
shl_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Shr` trait is used to specify the functionality of `>>`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Shr`. When `Foo >> Foo` happens, it ends up
|
|
|
|
/// calling `shr`, and therefore, `main` prints `Shifting right!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Shr<Foo, Foo> for Foo {
|
|
|
|
/// fn shr(&self, _rhs: &Foo) -> Foo {
|
|
|
|
/// println!("Shifting right!");
|
|
|
|
/// *self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo >> Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove trait after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2012-09-19 20:00:26 -05:00
|
|
|
#[lang="shr"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Shr<Sized? RHS, Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the `>>` operator
|
2013-03-21 23:20:48 -05:00
|
|
|
fn shr(&self, rhs: &RHS) -> Result;
|
2012-09-19 20:00:26 -05:00
|
|
|
}
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
// NOTE(stage0): Remove macro after a snapshot
|
|
|
|
#[cfg(stage0)]
|
2014-05-26 12:33:04 -05:00
|
|
|
macro_rules! shr_impl(
|
|
|
|
($($t:ty)*) => ($(
|
2014-07-04 01:15:25 -05:00
|
|
|
impl Shr<uint, $t> for $t {
|
2014-04-21 16:58:52 -05:00
|
|
|
#[inline]
|
2014-07-04 01:15:25 -05:00
|
|
|
fn shr(&self, other: &uint) -> $t { (*self) >> (*other) }
|
2014-04-21 16:58:52 -05:00
|
|
|
}
|
2014-05-26 12:33:04 -05:00
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-12-01 12:00:23 -06:00
|
|
|
/// The `Shr` trait is used to specify the functionality of `>>`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Shr`. When `Foo >> Foo` happens, it ends up
|
|
|
|
/// calling `shr`, and therefore, `main` prints `Shifting right!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
|
|
|
/// impl Shr<Foo, Foo> for Foo {
|
2014-12-01 18:10:12 -06:00
|
|
|
/// fn shr(self, _rhs: Foo) -> Foo {
|
2014-12-01 12:00:23 -06:00
|
|
|
/// println!("Shifting right!");
|
2014-12-01 18:10:12 -06:00
|
|
|
/// self
|
2014-12-01 12:00:23 -06:00
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo >> Foo;
|
|
|
|
/// }
|
|
|
|
/// ```
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
#[lang="shr"]
|
|
|
|
pub trait Shr<RHS, Result> {
|
|
|
|
/// The method for the `>>` operator
|
|
|
|
fn shr(self, rhs: RHS) -> Result;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(stage0))] // NOTE(stage0): Remove cfg after a snapshot
|
|
|
|
macro_rules! shr_impl(
|
|
|
|
($($t:ty)*) => ($(
|
|
|
|
impl Shr<uint, $t> for $t {
|
|
|
|
#[inline]
|
|
|
|
fn shr(self, other: uint) -> $t { self >> other }
|
|
|
|
}
|
|
|
|
)*)
|
|
|
|
)
|
|
|
|
|
2014-05-26 12:33:04 -05:00
|
|
|
shr_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64)
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Index` trait is used to specify the functionality of indexing operations
|
|
|
|
/// like `arr[idx]` when used in an immutable context.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Index`. When `Foo[Foo]` happens, it ends up
|
|
|
|
/// calling `index`, and therefore, `main` prints `Indexing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Index<Foo, Foo> for Foo {
|
|
|
|
/// fn index<'a>(&'a self, _index: &Foo) -> &'a Foo {
|
|
|
|
/// println!("Indexing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo[Foo];
|
|
|
|
/// }
|
|
|
|
/// ```
|
2012-11-28 15:51:50 -06:00
|
|
|
#[lang="index"]
|
2014-11-16 21:44:19 -06:00
|
|
|
pub trait Index<Sized? Index, Sized? Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method for the indexing (`Foo[Bar]`) operation
|
2014-07-03 16:32:41 -05:00
|
|
|
fn index<'a>(&'a self, index: &Index) -> &'a Result;
|
|
|
|
}
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `IndexMut` trait is used to specify the functionality of indexing
|
|
|
|
/// operations like `arr[idx]`, when used in a mutable context.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `IndexMut`. When `Foo[Foo]` happens, it ends up
|
|
|
|
/// calling `index_mut`, and therefore, `main` prints `Indexing!`.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl IndexMut<Foo, Foo> for Foo {
|
|
|
|
/// fn index_mut<'a>(&'a mut self, _index: &Foo) -> &'a mut Foo {
|
|
|
|
/// println!("Indexing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// &mut Foo[Foo];
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-07-03 16:32:41 -05:00
|
|
|
#[lang="index_mut"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait IndexMut<Sized? Index, Sized? Result> for Sized? {
|
2014-07-03 16:32:41 -05:00
|
|
|
/// The method for the indexing (`Foo[Bar]`) operation
|
|
|
|
fn index_mut<'a>(&'a mut self, index: &Index) -> &'a mut Result;
|
2012-11-28 15:51:50 -06:00
|
|
|
}
|
2013-07-22 18:50:17 -05:00
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Slice` trait is used to specify the functionality of slicing operations
|
|
|
|
/// like `arr[from..to]` when used in an immutable context.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `Slice`. When `Foo[..Foo]` happens, it ends up
|
|
|
|
/// calling `slice_to`, and therefore, `main` prints `Slicing!`.
|
|
|
|
///
|
|
|
|
/// ```ignore
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl Slice<Foo, Foo> for Foo {
|
|
|
|
/// fn as_slice_<'a>(&'a self) -> &'a Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// fn slice_from_or_fail<'a>(&'a self, _from: &Foo) -> &'a Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// fn slice_to_or_fail<'a>(&'a self, _to: &Foo) -> &'a Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// fn slice_or_fail<'a>(&'a self, _from: &Foo, _to: &Foo) -> &'a Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// Foo[..Foo];
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-10-04 17:59:10 -05:00
|
|
|
#[lang="slice"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Slice<Sized? Idx, Sized? Result> for Sized? {
|
2014-10-04 17:59:10 -05:00
|
|
|
/// The method for the slicing operation foo[]
|
|
|
|
fn as_slice_<'a>(&'a self) -> &'a Result;
|
|
|
|
/// The method for the slicing operation foo[from..]
|
|
|
|
fn slice_from_or_fail<'a>(&'a self, from: &Idx) -> &'a Result;
|
|
|
|
/// The method for the slicing operation foo[..to]
|
|
|
|
fn slice_to_or_fail<'a>(&'a self, to: &Idx) -> &'a Result;
|
|
|
|
/// The method for the slicing operation foo[from..to]
|
|
|
|
fn slice_or_fail<'a>(&'a self, from: &Idx, to: &Idx) -> &'a Result;
|
|
|
|
}
|
2014-09-15 03:48:58 -05:00
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `SliceMut` trait is used to specify the functionality of slicing
|
|
|
|
/// operations like `arr[from..to]`, when used in a mutable context.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A trivial implementation of `SliceMut`. When `Foo[Foo..]` happens, it ends up
|
|
|
|
/// calling `slice_from_mut`, and therefore, `main` prints `Slicing!`.
|
|
|
|
///
|
|
|
|
/// ```ignore
|
|
|
|
/// struct Foo;
|
|
|
|
///
|
librustc: Make `Copy` opt-in.
This change makes the compiler no longer infer whether types (structures
and enumerations) implement the `Copy` trait (and thus are implicitly
copyable). Rather, you must implement `Copy` yourself via `impl Copy for
MyType {}`.
A new warning has been added, `missing_copy_implementations`, to warn
you if a non-generic public type has been added that could have
implemented `Copy` but didn't.
For convenience, you may *temporarily* opt out of this behavior by using
`#![feature(opt_out_copy)]`. Note though that this feature gate will never be
accepted and will be removed by the time that 1.0 is released, so you should
transition your code away from using it.
This breaks code like:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
Change this code to:
#[deriving(Show)]
struct Point2D {
x: int,
y: int,
}
impl Copy for Point2D {}
fn main() {
let mypoint = Point2D {
x: 1,
y: 1,
};
let otherpoint = mypoint;
println!("{}{}", mypoint, otherpoint);
}
This is the backwards-incompatible part of #13231.
Part of RFC #3.
[breaking-change]
2014-12-05 19:01:33 -06:00
|
|
|
/// impl Copy for Foo {}
|
|
|
|
///
|
2014-11-24 19:06:06 -06:00
|
|
|
/// impl SliceMut<Foo, Foo> for Foo {
|
|
|
|
/// fn as_mut_slice_<'a>(&'a mut self) -> &'a mut Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// fn slice_from_or_fail_mut<'a>(&'a mut self, _from: &Foo) -> &'a mut Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// fn slice_to_or_fail_mut<'a>(&'a mut self, _to: &Foo) -> &'a mut Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// fn slice_or_fail_mut<'a>(&'a mut self, _from: &Foo, _to: &Foo) -> &'a mut Foo {
|
|
|
|
/// println!("Slicing!");
|
|
|
|
/// self
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// pub fn main() {
|
|
|
|
/// Foo[mut Foo..];
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-10-04 17:59:10 -05:00
|
|
|
#[lang="slice_mut"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait SliceMut<Sized? Idx, Sized? Result> for Sized? {
|
2014-10-04 17:59:10 -05:00
|
|
|
/// The method for the slicing operation foo[]
|
|
|
|
fn as_mut_slice_<'a>(&'a mut self) -> &'a mut Result;
|
|
|
|
/// The method for the slicing operation foo[from..]
|
|
|
|
fn slice_from_or_fail_mut<'a>(&'a mut self, from: &Idx) -> &'a mut Result;
|
|
|
|
/// The method for the slicing operation foo[..to]
|
|
|
|
fn slice_to_or_fail_mut<'a>(&'a mut self, to: &Idx) -> &'a mut Result;
|
|
|
|
/// The method for the slicing operation foo[from..to]
|
|
|
|
fn slice_or_fail_mut<'a>(&'a mut self, from: &Idx, to: &Idx) -> &'a mut Result;
|
|
|
|
}
|
2014-10-10 23:59:10 -05:00
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `Deref` trait is used to specify the functionality of dereferencing
|
|
|
|
/// operations like `*v`.
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A struct with a single field which is accessible via dereferencing the
|
|
|
|
/// struct.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct DerefExample<T> {
|
|
|
|
/// value: T
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// impl<T> Deref<T> for DerefExample<T> {
|
|
|
|
/// fn deref<'a>(&'a self) -> &'a T {
|
|
|
|
/// &self.value
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// let x = DerefExample { value: 'a' };
|
|
|
|
/// assert_eq!('a', *x);
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-02-26 15:02:35 -06:00
|
|
|
#[lang="deref"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Deref<Sized? Result> for Sized? {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method called to dereference a value
|
2014-02-26 15:02:35 -06:00
|
|
|
fn deref<'a>(&'a self) -> &'a Result;
|
|
|
|
}
|
|
|
|
|
2014-11-06 16:34:33 -06:00
|
|
|
impl<'a, Sized? T> Deref<T> for &'a T {
|
|
|
|
fn deref(&self) -> &T { *self }
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, Sized? T> Deref<T> for &'a mut T {
|
|
|
|
fn deref(&self) -> &T { *self }
|
|
|
|
}
|
|
|
|
|
2014-11-24 19:06:06 -06:00
|
|
|
/// The `DerefMut` trait is used to specify the functionality of dereferencing
|
|
|
|
/// mutably like `*v = 1;`
|
|
|
|
///
|
|
|
|
/// # Example
|
|
|
|
///
|
|
|
|
/// A struct with a single field which is modifiable via dereferencing the
|
|
|
|
/// struct.
|
|
|
|
///
|
|
|
|
/// ```
|
|
|
|
/// struct DerefMutExample<T> {
|
|
|
|
/// value: T
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// impl<T> Deref<T> for DerefMutExample<T> {
|
|
|
|
/// fn deref<'a>(&'a self) -> &'a T {
|
|
|
|
/// &self.value
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// impl<T> DerefMut<T> for DerefMutExample<T> {
|
|
|
|
/// fn deref_mut<'a>(&'a mut self) -> &'a mut T {
|
|
|
|
/// &mut self.value
|
|
|
|
/// }
|
|
|
|
/// }
|
|
|
|
///
|
|
|
|
/// fn main() {
|
|
|
|
/// let mut x = DerefMutExample { value: 'a' };
|
|
|
|
/// *x = 'b';
|
|
|
|
/// assert_eq!('b', *x);
|
|
|
|
/// }
|
|
|
|
/// ```
|
2014-02-26 15:02:35 -06:00
|
|
|
#[lang="deref_mut"]
|
2014-12-04 03:10:58 -06:00
|
|
|
pub trait DerefMut<Sized? Result> for Sized? : Deref<Result> {
|
2014-03-16 17:35:35 -05:00
|
|
|
/// The method called to mutably dereference a value
|
2014-02-26 15:02:35 -06:00
|
|
|
fn deref_mut<'a>(&'a mut self) -> &'a mut Result;
|
|
|
|
}
|
|
|
|
|
2014-11-06 16:34:33 -06:00
|
|
|
impl<'a, Sized? T> DerefMut<T> for &'a mut T {
|
|
|
|
fn deref_mut(&mut self) -> &mut T { *self }
|
|
|
|
}
|
|
|
|
|
2014-06-01 18:35:01 -05:00
|
|
|
/// A version of the call operator that takes an immutable receiver.
|
|
|
|
#[lang="fn"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait Fn<Args,Result> for Sized? {
|
2014-06-01 18:35:01 -05:00
|
|
|
/// This is called when the call operator is used.
|
2014-11-01 12:51:16 -05:00
|
|
|
extern "rust-call" fn call(&self, args: Args) -> Result;
|
2014-06-01 18:35:01 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/// A version of the call operator that takes a mutable receiver.
|
|
|
|
#[lang="fn_mut"]
|
2014-11-05 09:18:32 -06:00
|
|
|
pub trait FnMut<Args,Result> for Sized? {
|
2014-06-01 18:35:01 -05:00
|
|
|
/// This is called when the call operator is used.
|
2014-11-01 12:51:16 -05:00
|
|
|
extern "rust-call" fn call_mut(&mut self, args: Args) -> Result;
|
2014-06-01 18:35:01 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
/// A version of the call operator that takes a by-value receiver.
|
|
|
|
#[lang="fn_once"]
|
2014-12-05 12:53:38 -06:00
|
|
|
pub trait FnOnce<Args,Result> {
|
2014-06-01 18:35:01 -05:00
|
|
|
/// This is called when the call operator is used.
|
2014-11-01 12:51:16 -05:00
|
|
|
extern "rust-call" fn call_once(self, args: Args) -> Result;
|
2014-06-01 18:35:01 -05:00
|
|
|
}
|
2014-05-29 00:26:56 -05:00
|
|
|
|
2014-12-05 12:53:38 -06:00
|
|
|
impl<Sized? F,A,R> FnMut<A,R> for F
|
2014-10-28 06:24:25 -05:00
|
|
|
where F : Fn<A,R>
|
|
|
|
{
|
|
|
|
extern "rust-call" fn call_mut(&mut self, args: A) -> R {
|
|
|
|
self.call(args)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<F,A,R> FnOnce<A,R> for F
|
|
|
|
where F : FnMut<A,R>
|
|
|
|
{
|
|
|
|
extern "rust-call" fn call_once(mut self, args: A) -> R {
|
|
|
|
self.call_mut(args)
|
|
|
|
}
|
|
|
|
}
|