librustc (RFC #34): Implement the new Index and IndexMut traits.
This will break code that used the old `Index` trait. Change this code
to use the new `Index` traits. For reference, here are their signatures:
pub trait Index<Index,Result> {
fn index<'a>(&'a self, index: &Index) -> &'a Result;
}
pub trait IndexMut<Index,Result> {
fn index_mut<'a>(&'a mut self, index: &Index) -> &'a mut Result;
}
Closes #6515.
[breaking-change]
This commit is contained in:
parent
4f120e6baf
commit
7e4e99123a
18 changed files with 433 additions and 167 deletions
|
|
@ -1,22 +0,0 @@
|
|||
// 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.
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
pub enum maybe<T> { just(T), nothing }
|
||||
|
||||
impl <T:Clone> Index<uint,T> for maybe<T> {
|
||||
fn index(&self, _idx: &uint) -> T {
|
||||
match self {
|
||||
&just(ref t) => (*t).clone(),
|
||||
¬hing => { fail!(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
// 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.
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
extern crate issue2378a;
|
||||
|
||||
use issue2378a::maybe;
|
||||
|
||||
pub struct two_maybes<T> {pub a: maybe<T>, pub b: maybe<T>}
|
||||
|
||||
impl<T:Clone> Index<uint,(T,T)> for two_maybes<T> {
|
||||
fn index(&self, idx: &uint) -> (T, T) {
|
||||
(self.a[*idx], self.b[*idx])
|
||||
}
|
||||
}
|
||||
64
src/test/compile-fail/borrowck-overloaded-index.rs
Normal file
64
src/test/compile-fail/borrowck-overloaded-index.rs
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
struct Foo {
|
||||
x: int,
|
||||
y: int,
|
||||
}
|
||||
|
||||
impl Index<String,int> for Foo {
|
||||
fn index<'a>(&'a self, z: &String) -> &'a int {
|
||||
if z.as_slice() == "x" {
|
||||
&self.x
|
||||
} else {
|
||||
&self.y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexMut<String,int> for Foo {
|
||||
fn index_mut<'a>(&'a mut self, z: &String) -> &'a mut int {
|
||||
if z.as_slice() == "x" {
|
||||
&mut self.x
|
||||
} else {
|
||||
&mut self.y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct Bar {
|
||||
x: int,
|
||||
}
|
||||
|
||||
impl Index<int,int> for Bar {
|
||||
fn index<'a>(&'a self, z: &int) -> &'a int {
|
||||
&self.x
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut f = Foo {
|
||||
x: 1,
|
||||
y: 2,
|
||||
};
|
||||
let mut s = "hello".to_string();
|
||||
let rs = &mut s;
|
||||
println!("{}", f[s]);
|
||||
//~^ ERROR cannot borrow `s` as immutable because it is also borrowed as mutable
|
||||
f[s] = 10;
|
||||
//~^ ERROR cannot borrow `s` as immutable because it is also borrowed as mutable
|
||||
let s = Bar {
|
||||
x: 1,
|
||||
};
|
||||
s[2] = 20;
|
||||
//~^ ERROR cannot assign to immutable indexed content
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -16,13 +16,13 @@ use std::collections::Bitv;
|
|||
fn main() {
|
||||
// Generate sieve of Eratosthenes for n up to 1e6
|
||||
let n = 1000000u;
|
||||
let sieve = Bitv::with_capacity(n+1, true);
|
||||
let mut sieve = Bitv::with_capacity(n+1, true);
|
||||
let limit: uint = (n as f32).sqrt() as uint;
|
||||
for i in range(2, limit+1) {
|
||||
if sieve[i] {
|
||||
let mut j = 0;
|
||||
while i*i + j*i <= n {
|
||||
sieve[i*i+j*i] = false;
|
||||
sieve.set(i*i+j*i, false);
|
||||
j += 1;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
// Copyright 2012-2014 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.
|
||||
|
||||
// aux-build:issue2378a.rs
|
||||
// aux-build:issue2378b.rs
|
||||
|
||||
extern crate issue2378a;
|
||||
extern crate issue2378b;
|
||||
|
||||
use issue2378a::{just};
|
||||
use issue2378b::{two_maybes};
|
||||
|
||||
pub fn main() {
|
||||
let x = two_maybes{a: just(3i), b: just(5i)};
|
||||
assert_eq!(x[0u], (3, 5));
|
||||
}
|
||||
|
|
@ -43,8 +43,12 @@ impl ops::Not<Point> for Point {
|
|||
}
|
||||
|
||||
impl ops::Index<bool,int> for Point {
|
||||
fn index(&self, x: &bool) -> int {
|
||||
if *x { self.x } else { self.y }
|
||||
fn index<'a>(&'a self, x: &bool) -> &'a int {
|
||||
if *x {
|
||||
&self.x
|
||||
} else {
|
||||
&self.y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -31,10 +31,10 @@ impl<K,V> AssociationList<K,V> {
|
|||
}
|
||||
|
||||
impl<K:PartialEq,V:Clone> Index<K,V> for AssociationList<K,V> {
|
||||
fn index(&self, index: &K) -> V {
|
||||
fn index<'a>(&'a self, index: &K) -> &'a V {
|
||||
for pair in self.pairs.iter() {
|
||||
if pair.key == *index {
|
||||
return pair.value.clone();
|
||||
return &pair.value
|
||||
}
|
||||
}
|
||||
fail!("No value found for key: {:?}", index);
|
||||
|
|
|
|||
53
src/test/run-pass/overloaded-index.rs
Normal file
53
src/test/run-pass/overloaded-index.rs
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
// Copyright 2014 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.
|
||||
|
||||
struct Foo {
|
||||
x: int,
|
||||
y: int,
|
||||
}
|
||||
|
||||
impl Index<int,int> for Foo {
|
||||
fn index<'a>(&'a self, z: &int) -> &'a int {
|
||||
if *z == 0 {
|
||||
&self.x
|
||||
} else {
|
||||
&self.y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl IndexMut<int,int> for Foo {
|
||||
fn index_mut<'a>(&'a mut self, z: &int) -> &'a mut int {
|
||||
if *z == 0 {
|
||||
&mut self.x
|
||||
} else {
|
||||
&mut self.y
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut f = Foo {
|
||||
x: 1,
|
||||
y: 2,
|
||||
};
|
||||
assert_eq!(f[1], 2);
|
||||
f[0] = 3;
|
||||
assert_eq!(f[0], 3);
|
||||
{
|
||||
let p = &mut f[1];
|
||||
*p = 4;
|
||||
}
|
||||
{
|
||||
let p = &f[1];
|
||||
assert_eq!(*p, 4);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue