nalgebra/src/structs/point_macros.rs

201 lines
4.6 KiB
Rust
Raw Normal View History

2015-01-08 04:11:09 +08:00
#![macro_use]
2016-07-24 02:57:28 +08:00
macro_rules! point_impl(
($t: ident, $tv: ident | $($compN: ident),+) => (
/*
*
* Origin.
*
*/
impl<N: Zero> Origin for $t<N> {
#[inline]
fn origin() -> $t<N> {
$t {
2015-01-10 04:55:15 +08:00
$($compN: ::zero() ),+
}
}
#[inline]
fn is_origin(&self) -> bool {
2015-01-10 04:55:15 +08:00
$(self.$compN.is_zero() )&&+
}
}
2016-07-24 02:57:28 +08:00
/*
*
* Point - Point
*
*/
impl<N: Copy + Sub<N, Output = N>> Sub<$t<N>> for $t<N> {
type Output = $tv<N>;
#[inline]
fn sub(self, right: $t<N>) -> $tv<N> {
*self.as_vector() - *right.as_vector()
}
}
2016-07-24 02:57:28 +08:00
/*
*
* Point + Vector
*
*/
impl<N: Copy + Add<N, Output = N>> Add<$tv<N>> for $t<N> {
type Output = $t<N>;
#[inline]
fn add(self, right: $tv<N>) -> $t<N> {
2015-01-10 04:55:15 +08:00
$t::new($(self.$compN + right.$compN),+)
}
}
impl<N: Copy + AddAssign<N>> AddAssign<$tv<N>> for $t<N> {
#[inline]
fn add_assign(&mut self, right: $tv<N>) {
$( self.$compN += right.$compN; )+
}
}
2016-07-24 02:57:28 +08:00
/*
*
* Point - Vector
*
*/
impl<N: Copy + Sub<N, Output = N>> Sub<$tv<N>> for $t<N> {
type Output = $t<N>;
#[inline]
fn sub(self, right: $tv<N>) -> $t<N> {
2015-01-10 04:55:15 +08:00
$t::new($(self.$compN - right.$compN),+)
}
}
impl<N: Copy + SubAssign<N>> SubAssign<$tv<N>> for $t<N> {
#[inline]
fn sub_assign(&mut self, right: $tv<N>) {
$( self.$compN -= right.$compN; )+
}
}
2016-07-24 02:57:28 +08:00
/*
*
* Point as vector.
*
*/
impl<N> $t<N> {
2014-10-12 16:35:56 +08:00
/// Converts this point to its associated vector.
2014-10-10 18:19:37 +08:00
#[inline]
pub fn to_vector(self) -> $tv<N> {
2014-10-10 18:19:37 +08:00
$tv::new(
2015-01-10 04:55:15 +08:00
$(self.$compN),+
2014-10-10 18:19:37 +08:00
)
}
2014-10-12 16:35:56 +08:00
/// Converts a reference to this point to a reference to its associated vector.
#[inline]
pub fn as_vector(&self) -> &$tv<N> {
unsafe {
mem::transmute(self)
}
}
2014-10-11 02:56:40 +08:00
#[inline]
fn set_coords(&mut self, v: $tv<N>) {
2015-01-10 04:55:15 +08:00
$(self.$compN = v.$compN;)+
2014-10-11 02:56:40 +08:00
}
}
impl<N> PointAsVector for $t<N> {
type Vector = $tv<N>;
2014-10-10 18:19:37 +08:00
#[inline]
fn to_vector(self) -> $tv<N> {
self.to_vector()
2014-10-10 18:19:37 +08:00
}
#[inline]
fn as_vector(&self) -> &$tv<N> {
self.as_vector()
}
2014-10-11 02:56:40 +08:00
#[inline]
fn set_coords(&mut self, v: $tv<N>) {
self.set_coords(v)
}
}
2016-07-24 02:57:28 +08:00
/*
*
* NumPoint / FloatPoint
*
*/
impl<N> NumPoint<N> for $t<N>
where N: BaseNum {
}
impl<N> FloatPoint<N> for $t<N>
where N: BaseFloat + ApproxEq<N> {
}
2016-07-24 02:57:28 +08:00
/*
*
* Display
*
*/
impl<N: fmt::Display> fmt::Display for $t<N> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// FIXME: differenciate them from vectors ?
try!(write!(f, "("));
let mut it = self.iter();
try!(write!(f, "{}", *it.next().unwrap()));
for comp in it {
try!(write!(f, ", {}", *comp));
}
write!(f, ")")
}
}
2016-07-24 02:57:28 +08:00
);
($t: ident, $tv: ident, $th: ident, $comp_extra: ident | $($compN: ident),+) => (
point_impl!($t, $tv | $($compN),+);
/*
*
* ToHomogeneous / FromHomogeneous
*
*/
impl<N: Copy + One + Zero> ToHomogeneous<$th<N>> for $t<N> {
fn to_homogeneous(&self) -> $th<N> {
let mut res: $th<N> = Origin::origin();
$( res.$compN = self.$compN; )+
res.$comp_extra = ::one();
res
}
}
impl<N: Copy + Div<N, Output = N> + One + Zero> FromHomogeneous<$th<N>> for $t<N> {
fn from(v: &$th<N>) -> $t<N> {
let mut res: $t<N> = Origin::origin();
$( res.$compN = v.$compN / v.$comp_extra; )+
res
}
}
)
);