Add general Dimensioned
and SwapComponents
impls
This commit is contained in:
parent
679db701c9
commit
df3ce2935c
2 changed files with 97 additions and 0 deletions
|
@ -40,6 +40,31 @@ macro_rules! impl_dimensioned(
|
|||
unsafe { transmute(self) }
|
||||
}
|
||||
}
|
||||
);
|
||||
($Self:ident) => (
|
||||
impl Dimensioned<$Self,[$Self,..1]> for $Self {
|
||||
#[inline]
|
||||
pub fn i<'a>(&'a self, i: uint) -> &'a $Self {
|
||||
&'a self.as_slice()[i]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn mut_i<'a>(&'a mut self, i: uint) -> &'a mut $Self {
|
||||
&'a mut self.as_mut_slice()[i]
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn as_slice<'a>(&'a self) -> &'a [$Self,..1] {
|
||||
use std::cast::transmute;
|
||||
unsafe { transmute(self) }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn as_mut_slice<'a>(&'a mut self) -> &'a mut [$Self,..1] {
|
||||
use std::cast::transmute;
|
||||
unsafe { transmute(self) }
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
|
||||
|
|
|
@ -50,3 +50,75 @@ pub trait Dimensioned<T,Slice> {
|
|||
pub trait SwapComponents {
|
||||
pub fn swap(&mut self, a: uint, b: uint);
|
||||
}
|
||||
|
||||
// `Dimensioned` impls for primitive numeric types
|
||||
|
||||
impl_dimensioned!(u8)
|
||||
impl_dimensioned!(u16)
|
||||
impl_dimensioned!(u32)
|
||||
impl_dimensioned!(u64)
|
||||
impl_dimensioned!(uint)
|
||||
impl_dimensioned!(i8)
|
||||
impl_dimensioned!(i16)
|
||||
impl_dimensioned!(i32)
|
||||
impl_dimensioned!(i64)
|
||||
impl_dimensioned!(int)
|
||||
impl_dimensioned!(f32)
|
||||
impl_dimensioned!(f64)
|
||||
impl_dimensioned!(float)
|
||||
|
||||
// Helper type aliases for implementing `Dimendioned` and `SwapComponents`
|
||||
// for tuples.
|
||||
|
||||
pub type Tuple1<T> = (T,);
|
||||
pub type Tuple2<T> = (T,T);
|
||||
pub type Tuple3<T> = (T,T,T);
|
||||
pub type Tuple4<T> = (T,T,T,T);
|
||||
pub type Tuple5<T> = (T,T,T,T,T);
|
||||
pub type Tuple6<T> = (T,T,T,T,T,T);
|
||||
|
||||
// `Dimensioned` impls for tuples
|
||||
|
||||
impl_dimensioned!(Tuple1, T, 1)
|
||||
impl_dimensioned!(Tuple2, T, 2)
|
||||
impl_dimensioned!(Tuple3, T, 3)
|
||||
impl_dimensioned!(Tuple4, T, 4)
|
||||
impl_dimensioned!(Tuple5, T, 5)
|
||||
impl_dimensioned!(Tuple6, T, 6)
|
||||
|
||||
// `SwapComponents` impls for tuples
|
||||
|
||||
impl_swap_components!(Tuple1)
|
||||
impl_swap_components!(Tuple2)
|
||||
impl_swap_components!(Tuple3)
|
||||
impl_swap_components!(Tuple4)
|
||||
impl_swap_components!(Tuple5)
|
||||
impl_swap_components!(Tuple6)
|
||||
|
||||
// Helper type aliases for implementing `Dimendioned` and `SwapComponents`
|
||||
// for fixed length vectors.
|
||||
|
||||
pub type Fixed1<T> = [T, ..1];
|
||||
pub type Fixed2<T> = [T, ..2];
|
||||
pub type Fixed3<T> = [T, ..3];
|
||||
pub type Fixed4<T> = [T, ..4];
|
||||
pub type Fixed5<T> = [T, ..5];
|
||||
pub type Fixed6<T> = [T, ..6];
|
||||
|
||||
// `Dimensioned` impls for fixed length vectors
|
||||
|
||||
impl_dimensioned!(Fixed1, T, 1)
|
||||
impl_dimensioned!(Fixed2, T, 2)
|
||||
impl_dimensioned!(Fixed3, T, 3)
|
||||
impl_dimensioned!(Fixed4, T, 4)
|
||||
impl_dimensioned!(Fixed5, T, 5)
|
||||
impl_dimensioned!(Fixed6, T, 6)
|
||||
|
||||
// `SwapComponents` impls for fixed length vectors
|
||||
|
||||
impl_swap_components!(Fixed1)
|
||||
impl_swap_components!(Fixed2)
|
||||
impl_swap_components!(Fixed3)
|
||||
impl_swap_components!(Fixed4)
|
||||
impl_swap_components!(Fixed5)
|
||||
impl_swap_components!(Fixed6)
|
||||
|
|
Loading…
Reference in a new issue