diff options
| author | bors <bors@rust-lang.org> | 2014-11-07 09:31:50 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-11-07 09:31:50 +0000 |
| commit | 932eec7d702cf2cf55554e2431c3cb0fecd19014 (patch) | |
| tree | a8497b89345254e64d00f1513b5c51c8cc9e8d87 /src | |
| parent | a0a7ab461283322215f0343cd2b5e66fc19a7bd5 (diff) | |
| parent | f7c1771fd18672a148979d334bf732d15a2c4023 (diff) | |
| download | rust-932eec7d702cf2cf55554e2431c3cb0fecd19014.tar.gz rust-932eec7d702cf2cf55554e2431c3cb0fecd19014.zip | |
auto merge of #18698 : japaric/rust/index, r=alexcrichton
Closes #16529 r? @aturon
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcore/ops.rs | 4 | ||||
| -rw-r--r-- | src/libcore/slice.rs | 17 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/libcore/ops.rs b/src/libcore/ops.rs index ac735492be4..5475eef9d47 100644 --- a/src/libcore/ops.rs +++ b/src/libcore/ops.rs @@ -638,7 +638,7 @@ shr_impl!(uint u8 u16 u32 u64 int i8 i16 i32 i64) * ``` */ #[lang="index"] -pub trait Index<Index, Sized? Result> { +pub trait Index<Index, Sized? Result> for Sized? { /// The method for the indexing (`Foo[Bar]`) operation fn index<'a>(&'a self, index: &Index) -> &'a Result; } @@ -669,7 +669,7 @@ pub trait Index<Index, Sized? Result> { * ``` */ #[lang="index_mut"] -pub trait IndexMut<Index, Result> { +pub trait IndexMut<Index, Result> for Sized? { /// The method for the indexing (`Foo[Bar]`) operation fn index_mut<'a>(&'a mut self, index: &Index) -> &'a mut Result; } diff --git a/src/libcore/slice.rs b/src/libcore/slice.rs index eaa52c99c4a..138422ceff1 100644 --- a/src/libcore/slice.rs +++ b/src/libcore/slice.rs @@ -256,7 +256,6 @@ pub trait SlicePrelude<T> for Sized? { #[inline] #[experimental = "not triaged yet"] fn is_empty(&self) -> bool { self.len() == 0 } - /// Returns a mutable reference to the element at the given index, /// or `None` if the index is out of bounds #[unstable = "waiting on final error conventions"] @@ -698,6 +697,22 @@ impl<T> SlicePrelude<T> for [T] { } } +impl<T> ops::Index<uint, T> for [T] { + fn index(&self, &index: &uint) -> &T { + assert!(index < self.len()); + + unsafe { mem::transmute(self.repr().data.offset(index as int)) } + } +} + +impl<T> ops::IndexMut<uint, T> for [T] { + fn index_mut(&mut self, &index: &uint) -> &mut T { + assert!(index < self.len()); + + unsafe { mem::transmute(self.repr().data.offset(index as int)) } + } +} + impl<T> ops::Slice<uint, [T]> for [T] { #[inline] fn as_slice_<'a>(&'a self) -> &'a [T] { |
