From 31be8b79dfff87df97ae0f17c72035a1eb0002fa Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Sun, 21 Jul 2013 13:20:28 +1000 Subject: [PATCH] Add map_as_vec{2,3,4} methods and document AsVec method impls These are useful for when for reusing methods available on the Vec{2,3,4} types. --- src/math/macros.rs | 18 ++++++++++++++---- src/math/vec.rs | 3 +++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/math/macros.rs b/src/math/macros.rs index 76dfe33..94b06ad 100644 --- a/src/math/macros.rs +++ b/src/math/macros.rs @@ -61,25 +61,35 @@ macro_rules! impl_to_vec_helper( ) macro_rules! impl_as_vec( - ($Self:ident, 2) => (impl_as_vec_helper!(AsVec2, $Self, Vec2, as_vec2, as_mut_vec2)); - ($Self:ident, 3) => (impl_as_vec_helper!(AsVec3, $Self, Vec3, as_vec3, as_mut_vec3)); - ($Self:ident, 4) => (impl_as_vec_helper!(AsVec4, $Self, Vec4, as_vec4, as_mut_vec4)); + ($Self:ident, 2) => (impl_as_vec_helper!(AsVec2, $Self, Vec2, as_vec2, as_mut_vec2, map_as_vec2)); + ($Self:ident, 3) => (impl_as_vec_helper!(AsVec3, $Self, Vec3, as_vec3, as_mut_vec3, map_as_vec3)); + ($Self:ident, 4) => (impl_as_vec_helper!(AsVec4, $Self, Vec4, as_vec4, as_mut_vec4, map_as_vec4)); ) macro_rules! impl_as_vec_helper( - ($AsVec:ident, $Self:ident, $Vec:ident, $as_vec:ident, $as_mut_vec:ident) => ( + ($AsVec:ident, $Self:ident, $Vec:ident, $as_vec:ident, $as_mut_vec:ident, $map_as_vec:ident) => ( impl $AsVec for $Self { + /// Safely transmute to a vec. #[inline] pub fn $as_vec<'a>(&'a self) -> &'a $Vec { use std::cast::transmute; unsafe { transmute(self) } } + /// Safely transmute to a mutable vec. #[inline] pub fn $as_mut_vec<'a>(&'a mut self) -> &'a mut $Vec { use std::cast::transmute; unsafe { transmute(self) } } + + /// Operate on `self` transmuted to a vec, then return the result as + /// transmuted back to the `Self` type. + #[inline] + pub fn $map_as_vec<'a>(&'a self, f: &fn(&'a $Vec) -> $Vec) -> $Self { + use std::cast::transmute; + unsafe { transmute(f(self.$as_vec())) } + } } ) ) diff --git a/src/math/vec.rs b/src/math/vec.rs index 3371e83..f3a104c 100644 --- a/src/math/vec.rs +++ b/src/math/vec.rs @@ -136,6 +136,7 @@ pub trait ToVec2 { pub trait AsVec2 { pub fn as_vec2<'a>(&'a self) -> &'a Vec2; pub fn as_mut_vec2<'a>(&'a mut self) -> &'a mut Vec2; + pub fn map_as_vec2<'a>(&'a self, f: &fn(&'a Vec2) -> Vec2) -> Self; } impl_dimensioned!(Vec2, T, 2) @@ -755,6 +756,7 @@ pub trait ToVec3 { pub trait AsVec3 { pub fn as_vec3<'a>(&'a self) -> &'a Vec3; pub fn as_mut_vec3<'a>(&'a mut self) -> &'a mut Vec3; + pub fn map_as_vec3<'a>(&'a self, f: &fn(&'a Vec3) -> Vec3) -> Self; } impl_dimensioned!(Vec3, T, 3) @@ -1446,6 +1448,7 @@ pub trait ToVec4 { pub trait AsVec4 { pub fn as_vec4<'a>(&'a self) -> &'a Vec4; pub fn as_mut_vec4<'a>(&'a mut self) -> &'a mut Vec4; + pub fn map_as_vec4<'a>(&'a self, f: &fn(&'a Vec4) -> Vec4) -> Self; } impl_dimensioned!(Vec4, T, 4)