From ad59c9b16f68566f9a50579b458f3e92650ec717 Mon Sep 17 00:00:00 2001 From: Brendan Zabarauskas Date: Fri, 12 Jul 2013 16:36:36 +1000 Subject: [PATCH] Decouple vec module from Point2 and Point3 --- src/core/vec.rs | 41 ----------------------------------------- src/geom/geom.rs | 4 +++- src/geom/point.rs | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 42 deletions(-) diff --git a/src/core/vec.rs b/src/core/vec.rs index 9bad23b..1f979c8 100644 --- a/src/core/vec.rs +++ b/src/core/vec.rs @@ -13,12 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -#[cfg(geom)] -use std::cast; - use core::{Dimensional, Swap}; -#[cfg(geom)] -use geom::{Point2, Point3}; #[deriving(Clone, Eq)] pub struct Vec2 { x: T, y: T } @@ -66,24 +61,6 @@ impl Vec2 { } } -#[cfg(geom)] -impl Vec2 { - #[inline] - pub fn from_point(point: Point2) -> Vec2 { - unsafe { cast::transmute(point) } - } - - #[inline] - pub fn as_point<'a>(&'a self) -> &'a Point2 { - unsafe { cast::transmute(self) } - } - - #[inline] - pub fn as_mut_point<'a>(&'a mut self) -> &'a mut Point2 { - unsafe { cast::transmute(self) } - } -} - impl Vec2 { #[inline] pub fn from_value(value: T) -> Vec2 { @@ -588,24 +565,6 @@ impl Vec3 { } } -#[cfg(geom)] -impl Vec3 { - #[inline] - pub fn from_point(point: Point3) -> Vec3 { - unsafe { cast::transmute(point) } - } - - #[inline] - pub fn as_point<'a>(&'a self) -> &'a Point3 { - unsafe { cast::transmute(self) } - } - - #[inline] - pub fn as_mut_point<'a>(&'a mut self) -> &'a mut Point3 { - unsafe { cast::transmute(self) } - } -} - impl Vec3 { #[inline] pub fn from_value(value: T) -> Vec3 { diff --git a/src/geom/geom.rs b/src/geom/geom.rs index fbd27c9..735452e 100644 --- a/src/geom/geom.rs +++ b/src/geom/geom.rs @@ -16,7 +16,9 @@ pub use self::aabb::{AABB2, AABB3}; pub use self::frustum::{Frustum, FrustumPoints}; pub use self::plane::Plane3; -pub use self::point::{Point, Point2, Point3}; +pub use self::point::Point; +pub use self::point::{Point2, AsPoint2}; +pub use self::point::{Point3, AsPoint3}; pub use self::ray::{Ray2, Ray3}; pub use self::sphere::Sphere; diff --git a/src/geom/point.rs b/src/geom/point.rs index 0bfa4f7..fcb9dd1 100644 --- a/src/geom/point.rs +++ b/src/geom/point.rs @@ -52,6 +52,23 @@ impl_dimensional!(Point2, T, 2) impl_swap!(Point2) impl_approx!(Point2 { x, y }) +pub trait AsPoint2 { + pub fn as_point2<'a>(&'a self) -> &'a Point2; + pub fn as_mut_point2<'a>(&'a mut self) -> &'a mut Point2; +} + +impl AsPoint2 for Vec2 { + #[inline] + pub fn as_point2<'a>(&'a self) -> &'a Point2 { + unsafe { cast::transmute(self) } + } + + #[inline] + pub fn as_mut_point2<'a>(&'a mut self) -> &'a mut Point2 { + unsafe { cast::transmute(self) } + } +} + impl Point2 { #[inline] pub fn new(x: T, y: T) -> Point2 { @@ -192,6 +209,23 @@ impl_dimensional!(Point3, T, 3) impl_swap!(Point3) impl_approx!(Point3 { x, y, z }) +pub trait AsPoint3 { + pub fn as_point3<'a>(&'a self) -> &'a Point3; + pub fn as_mut_point3<'a>(&'a mut self) -> &'a mut Point3; +} + +impl AsPoint3 for Vec3 { + #[inline] + pub fn as_point3<'a>(&'a self) -> &'a Point3 { + unsafe { cast::transmute(self) } + } + + #[inline] + pub fn as_mut_point3<'a>(&'a mut self) -> &'a mut Point3 { + unsafe { cast::transmute(self) } + } +} + impl Point3 { #[inline] pub fn new(x: T, y: T, z: T) -> Point3 {