diff options
| author | Mara Bos <m-ou.se@m-ou.se> | 2020-11-16 17:26:11 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-16 17:26:11 +0100 |
| commit | 4cdd22062580b46cbb6cf97ca56d59ebeb1e91b7 (patch) | |
| tree | 4db6c92ac32c271ab3fc6b558ec1ba321ebf0d93 | |
| parent | f5230fbf76bafd86ee4376a0e26e551df8d17fec (diff) | |
| parent | c03dfa6671bb462d243c12c72c8829f98c99e394 (diff) | |
| download | rust-4cdd22062580b46cbb6cf97ca56d59ebeb1e91b7.tar.gz rust-4cdd22062580b46cbb6cf97ca56d59ebeb1e91b7.zip | |
Rollup merge of #74989 - pubfnbar:impl-array-indexing, r=KodrAus
Implement `Index` and `IndexMut` for arrays
Adds implementations of `Index` and `IndexMut` for arrays that simply forward to the slice indexing implementation in order to fix the following problem:
If you implement `Index<MyIndexType>` for an array, you lose all the other indexing functionality that used to be available to the array via its implicit coercion to a slice. An example of what I'm talking about:
```rust
use std::ops::Index;
pub enum MyIndexType {
_0, _1, _2, _3, _4, _5, _6, _7,
}
impl<T> Index<MyIndexType> for [T; 8] {
type Output = T;
fn index(&self, index: MyIndexType) -> &T {
unsafe { self.get_unchecked(index as usize) }
}
}
fn main() {
let array = [11u8; 8];
println!("{:?}", array[MyIndexType::_0]); // OK
println!("{:?}", array[0usize]); // error[E0277]
// ^^^^^^^^^^^^^ `[u8; 8]` cannot be indexed by `usize`
}
```
| -rw-r--r-- | library/core/src/array/mod.rs | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/library/core/src/array/mod.rs b/library/core/src/array/mod.rs index 123a191dd2c..769ef02873d 100644 --- a/library/core/src/array/mod.rs +++ b/library/core/src/array/mod.rs @@ -12,6 +12,7 @@ use crate::convert::{Infallible, TryFrom}; use crate::fmt; use crate::hash::{self, Hash}; use crate::marker::Unsize; +use crate::ops::{Index, IndexMut}; use crate::slice::{Iter, IterMut}; mod iter; @@ -208,6 +209,30 @@ impl<'a, T, const N: usize> IntoIterator for &'a mut [T; N] { } } +#[stable(feature = "index_trait_on_arrays", since = "1.50.0")] +impl<T, I, const N: usize> Index<I> for [T; N] +where + [T]: Index<I>, +{ + type Output = <[T] as Index<I>>::Output; + + #[inline] + fn index(&self, index: I) -> &Self::Output { + Index::index(self as &[T], index) + } +} + +#[stable(feature = "index_trait_on_arrays", since = "1.50.0")] +impl<T, I, const N: usize> IndexMut<I> for [T; N] +where + [T]: IndexMut<I>, +{ + #[inline] + fn index_mut(&mut self, index: I) -> &mut Self::Output { + IndexMut::index_mut(self as &mut [T], index) + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl<A, B, const N: usize> PartialEq<[B; N]> for [A; N] where |
