Skip to content

Commit

Permalink
Implement FixedSizeArray for all fixed size arrays
Browse files Browse the repository at this point in the history
Do so by using the fact that fixed size arrays (like `[u8; 8]` can be coerced
to slices `&[u8]`, this is expressed through the trait `Unsize<[T]>` that all
fixed size arrays implement.
  • Loading branch information
tbu- committed Aug 31, 2015
1 parent 811868e commit 4d2709d
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 14 deletions.
24 changes: 12 additions & 12 deletions src/libcore/array.rs
Expand Up @@ -26,7 +26,7 @@ use default::Default;
use fmt;
use hash::{Hash, self};
use iter::IntoIterator;
use marker::{Copy, Sized};
use marker::{Copy, Sized, Unsize};
use option::Option;
use slice::{Iter, IterMut, SliceExt};

Expand All @@ -41,21 +41,21 @@ pub trait FixedSizeArray<T> {
fn as_mut_slice(&mut self) -> &mut [T];
}

impl<T, A: Unsize<[T]>> FixedSizeArray<T> for A {
#[inline]
fn as_slice(&self) -> &[T] {
self
}
#[inline]
fn as_mut_slice(&mut self) -> &mut [T] {
self
}
}

// macro for implementing n-ary tuple functions and operations
macro_rules! array_impls {
($($N:expr)+) => {
$(
impl<T> FixedSizeArray<T> for [T; $N] {
#[inline]
fn as_slice(&self) -> &[T] {
&self[..]
}
#[inline]
fn as_mut_slice(&mut self) -> &mut [T] {
&mut self[..]
}
}

impl<T> AsRef<[T]> for [T; $N] {
#[inline]
fn as_ref(&self) -> &[T] {
Expand Down
28 changes: 28 additions & 0 deletions src/libcoretest/array.rs
@@ -0,0 +1,28 @@
// 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.
use core::array::FixedSizeArray;

#[test]
fn fixed_size_array() {
let mut array = [0; 64];
let mut zero_sized = [(); 64];
let mut empty_array = [0; 0];
let mut empty_zero_sized = [(); 0];

assert_eq!(FixedSizeArray::as_slice(&array).len(), 64);
assert_eq!(FixedSizeArray::as_slice(&zero_sized).len(), 64);
assert_eq!(FixedSizeArray::as_slice(&empty_array).len(), 0);
assert_eq!(FixedSizeArray::as_slice(&empty_zero_sized).len(), 0);

assert_eq!(FixedSizeArray::as_mut_slice(&mut array).len(), 64);
assert_eq!(FixedSizeArray::as_mut_slice(&mut zero_sized).len(), 64);
assert_eq!(FixedSizeArray::as_mut_slice(&mut empty_array).len(), 0);
assert_eq!(FixedSizeArray::as_mut_slice(&mut empty_zero_sized).len(), 0);
}
6 changes: 4 additions & 2 deletions src/libcoretest/lib.rs
Expand Up @@ -15,11 +15,12 @@
#![feature(const_fn)]
#![feature(core)]
#![feature(core_float)]
#![feature(dec2flt)]
#![feature(decode_utf16)]
#![feature(fixed_size_array)]
#![feature(float_extras)]
#![feature(float_from_str_radix)]
#![feature(flt2dec)]
#![feature(dec2flt)]
#![feature(decode_utf16)]
#![feature(fmt_radix)]
#![feature(iter_arith)]
#![feature(iter_arith)]
Expand Down Expand Up @@ -48,6 +49,7 @@ extern crate rustc_unicode;
extern crate rand;

mod any;
mod array;
mod atomic;
mod cell;
mod char;
Expand Down

0 comments on commit 4d2709d

Please sign in to comment.