Use macro instead of loop for Array::build
This commit is contained in:
parent
c84ca595b7
commit
df9c66d1bb
5 changed files with 18 additions and 16 deletions
|
@ -53,7 +53,7 @@ pub trait Array
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! array(
|
macro_rules! array(
|
||||||
(impl<$S:ident> $Self:ty -> [$T:ty, ..$n:expr]) => (
|
(impl<$S:ident> $Self:ty -> [$T:ty, ..$n:expr] $_n:ident) => (
|
||||||
impl<$S: Clone> Array<$T, [$T,..$n]> for $Self {
|
impl<$S: Clone> Array<$T, [$T,..$n]> for $Self {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn i<'a>(&'a self, i: uint) -> &'a $T {
|
fn i<'a>(&'a self, i: uint) -> &'a $T {
|
||||||
|
@ -82,12 +82,7 @@ macro_rules! array(
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn build(builder: &fn(i: uint) -> $T) -> $Self {
|
fn build(builder: &fn(i: uint) -> $T) -> $Self {
|
||||||
use std::unstable::intrinsics;
|
Array::from_slice(gen_builder!($_n))
|
||||||
let mut s: [$T,..$n] = unsafe { intrinsics::uninit() };
|
|
||||||
for i in range(0u, $n) {
|
|
||||||
s[i] = builder(i);
|
|
||||||
}
|
|
||||||
Array::from_slice(s)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -103,6 +98,13 @@ macro_rules! array(
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
macro_rules! gen_builder(
|
||||||
|
(_1) => ([builder(0)]);
|
||||||
|
(_2) => ([builder(0), builder(1)]);
|
||||||
|
(_3) => ([builder(0), builder(1), builder(2)]);
|
||||||
|
(_4) => ([builder(0), builder(1), builder(2), builder(3)]);
|
||||||
|
)
|
||||||
|
|
||||||
macro_rules! approx_eq(
|
macro_rules! approx_eq(
|
||||||
(impl<$S:ident> $Self:ty) => (
|
(impl<$S:ident> $Self:ty) => (
|
||||||
impl<$S: Clone + ApproxEq<$S>> ApproxEq<$S> for $Self {
|
impl<$S: Clone + ApproxEq<$S>> ApproxEq<$S> for $Self {
|
||||||
|
|
|
@ -163,9 +163,9 @@ impl<S: Clone + Float> One for Mat2<S> { #[inline] fn one() -> Mat2<S> { Mat2::i
|
||||||
impl<S: Clone + Float> One for Mat3<S> { #[inline] fn one() -> Mat3<S> { Mat3::ident() } }
|
impl<S: Clone + Float> One for Mat3<S> { #[inline] fn one() -> Mat3<S> { Mat3::ident() } }
|
||||||
impl<S: Clone + Float> One for Mat4<S> { #[inline] fn one() -> Mat4<S> { Mat4::ident() } }
|
impl<S: Clone + Float> One for Mat4<S> { #[inline] fn one() -> Mat4<S> { Mat4::ident() } }
|
||||||
|
|
||||||
array!(impl<S> Mat2<S> -> [Vec2<S>, ..2])
|
array!(impl<S> Mat2<S> -> [Vec2<S>, ..2] _2)
|
||||||
array!(impl<S> Mat3<S> -> [Vec3<S>, ..3])
|
array!(impl<S> Mat3<S> -> [Vec3<S>, ..3] _3)
|
||||||
array!(impl<S> Mat4<S> -> [Vec4<S>, ..4])
|
array!(impl<S> Mat4<S> -> [Vec4<S>, ..4] _4)
|
||||||
|
|
||||||
pub trait Matrix
|
pub trait Matrix
|
||||||
<
|
<
|
||||||
|
|
|
@ -76,8 +76,8 @@ pub trait Point
|
||||||
#[inline] fn add_self_v(&mut self, other: &V) { for (a, b) in self.mut_iter().zip(other.iter()) { *a = a.add(b) } }
|
#[inline] fn add_self_v(&mut self, other: &V) { for (a, b) in self.mut_iter().zip(other.iter()) { *a = a.add(b) } }
|
||||||
}
|
}
|
||||||
|
|
||||||
array!(impl<S> Point2<S> -> [S, ..2])
|
array!(impl<S> Point2<S> -> [S, ..2] _2)
|
||||||
array!(impl<S> Point3<S> -> [S, ..3])
|
array!(impl<S> Point3<S> -> [S, ..3] _3)
|
||||||
|
|
||||||
impl<S: Clone + Num + Ord> Point<S, Vec2<S>, [S, ..2]> for Point2<S>;
|
impl<S: Clone + Num + Ord> Point<S, Vec2<S>, [S, ..2]> for Point2<S>;
|
||||||
impl<S: Clone + Num + Ord> Point<S, Vec3<S>, [S, ..3]> for Point3<S>;
|
impl<S: Clone + Num + Ord> Point<S, Vec3<S>, [S, ..3]> for Point3<S>;
|
||||||
|
|
|
@ -103,7 +103,7 @@ pub trait ToRot3<S: Clone + Float> {
|
||||||
#[deriving(Eq, Clone)]
|
#[deriving(Eq, Clone)]
|
||||||
pub struct Euler<A> { x: A, y: A, z: A }
|
pub struct Euler<A> { x: A, y: A, z: A }
|
||||||
|
|
||||||
array!(impl<A> Euler<A> -> [A, ..3])
|
array!(impl<A> Euler<A> -> [A, ..3] _3)
|
||||||
|
|
||||||
pub trait ToEuler<A> {
|
pub trait ToEuler<A> {
|
||||||
fn to_euler(&self) -> Euler<A>;
|
fn to_euler(&self) -> Euler<A>;
|
||||||
|
|
|
@ -83,9 +83,9 @@ impl<S: Clone + Num + Ord> Vec4<S> {
|
||||||
#[inline] pub fn unit_w() -> Vec4<S> { Vec4::new(zero(), zero(), zero(), one()) }
|
#[inline] pub fn unit_w() -> Vec4<S> { Vec4::new(zero(), zero(), zero(), one()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
array!(impl<S> Vec2<S> -> [S, ..2])
|
array!(impl<S> Vec2<S> -> [S, ..2] _2)
|
||||||
array!(impl<S> Vec3<S> -> [S, ..3])
|
array!(impl<S> Vec3<S> -> [S, ..3] _3)
|
||||||
array!(impl<S> Vec4<S> -> [S, ..4])
|
array!(impl<S> Vec4<S> -> [S, ..4] _4)
|
||||||
|
|
||||||
approx_eq!(impl<S> Vec2<S>)
|
approx_eq!(impl<S> Vec2<S>)
|
||||||
approx_eq!(impl<S> Vec3<S>)
|
approx_eq!(impl<S> Vec3<S>)
|
||||||
|
|
Loading…
Reference in a new issue