Implement array sizes in the 16-bit index range
This commit is contained in:
+29
-6
@@ -4,6 +4,9 @@ pub unsafe trait Array {
|
||||
/// The array's element type
|
||||
type Item;
|
||||
#[doc(hidden)]
|
||||
/// The smallest index type that indexes the array.
|
||||
type Index: Index;
|
||||
#[doc(hidden)]
|
||||
fn as_ptr(&self) -> *const Self::Item;
|
||||
#[doc(hidden)]
|
||||
fn as_mut_ptr(&mut self) -> *mut Self::Item;
|
||||
@@ -11,10 +14,29 @@ pub unsafe trait Array {
|
||||
fn capacity() -> usize;
|
||||
}
|
||||
|
||||
pub trait Index : PartialEq + Copy {
|
||||
fn zero() -> Self;
|
||||
fn to_usize(self) -> usize;
|
||||
fn from(usize) -> Self;
|
||||
}
|
||||
|
||||
impl Index for u8 {
|
||||
fn zero() -> Self { 0 }
|
||||
fn to_usize(self) -> usize { self as usize }
|
||||
fn from(ix: usize) -> Self { ix as u8 }
|
||||
}
|
||||
|
||||
impl Index for u16 {
|
||||
fn zero() -> Self { 0 }
|
||||
fn to_usize(self) -> usize { self as usize }
|
||||
fn from(ix: usize) -> Self { ix as u16 }
|
||||
}
|
||||
|
||||
macro_rules! fix_array_impl {
|
||||
($len:expr ) => (
|
||||
($index_type:ty, $len:expr ) => (
|
||||
unsafe impl<T> Array for [T; $len] {
|
||||
type Item = T;
|
||||
type Index = $index_type;
|
||||
#[inline(always)]
|
||||
fn as_ptr(&self) -> *const T { self as *const _ as *const _ }
|
||||
#[inline(always)]
|
||||
@@ -26,14 +48,15 @@ macro_rules! fix_array_impl {
|
||||
}
|
||||
|
||||
macro_rules! fix_array_impl_recursive {
|
||||
() => ();
|
||||
($len:expr, $($more:expr,)*) => (
|
||||
fix_array_impl!($len);
|
||||
fix_array_impl_recursive!($($more,)*);
|
||||
($index_type:ty, ) => ();
|
||||
($index_type:ty, $len:expr, $($more:expr,)*) => (
|
||||
fix_array_impl!($index_type, $len);
|
||||
fix_array_impl_recursive!($index_type, $($more,)*);
|
||||
);
|
||||
}
|
||||
|
||||
fix_array_impl_recursive!(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
fix_array_impl_recursive!(u8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
||||
32, 40, 48, 56, 64, 72, 96, 128, 160, 192, 224,);
|
||||
fix_array_impl_recursive!(u16, 256, 384, 512, 768, 1024, 2048, 4096, 8192, 16384, 32768,);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user