Move Vector::from_value function to Array trait

This commit is contained in:
Brendan Zabarauskas 2016-04-04 19:53:55 +10:00
parent e0a5164967
commit 3b55ad5f70
3 changed files with 63 additions and 25 deletions

View file

@ -26,6 +26,17 @@ pub trait Array where
{ {
type Element: Copy; type Element: Copy;
/// Construct a vector from a single value, replicating it.
///
/// ```rust
/// use cgmath::prelude::*;
/// use cgmath::Vector3;
///
/// assert_eq!(Vector3::from_value(1),
/// Vector3::new(1, 1, 1));
/// ```
fn from_value(value: Self::Element) -> Self;
/// Get the pointer to the first element of the array. /// Get the pointer to the first element of the array.
#[inline] #[inline]
fn as_ptr(&self) -> *const Self::Element { fn as_ptr(&self) -> *const Self::Element {

View file

@ -169,10 +169,30 @@ macro_rules! impl_point {
impl<S: BaseNum> Array for $PointN<S> { impl<S: BaseNum> Array for $PointN<S> {
type Element = S; type Element = S;
#[inline] fn sum(self) -> S { fold_array!(add, { $(self.$field),+ }) } #[inline]
#[inline] fn product(self) -> S { fold_array!(mul, { $(self.$field),+ }) } fn from_value(scalar: S) -> $PointN<S> {
#[inline] fn min(self) -> S { fold_array!(partial_min, { $(self.$field),+ }) } $PointN { $($field: scalar),+ }
#[inline] fn max(self) -> S { fold_array!(partial_max, { $(self.$field),+ }) } }
#[inline]
fn sum(self) -> S where S: Add<Output = S> {
fold_array!(add, { $(self.$field),+ })
}
#[inline]
fn product(self) -> S where S: Mul<Output = S> {
fold_array!(mul, { $(self.$field),+ })
}
#[inline]
fn min(self) -> S where S: PartialOrd {
fold_array!(partial_min, { $(self.$field),+ })
}
#[inline]
fn max(self) -> S where S: PartialOrd {
fold_array!(partial_max, { $(self.$field),+ })
}
} }
impl<S: BaseNum> Point for $PointN<S> { impl<S: BaseNum> Point for $PointN<S> {

View file

@ -22,11 +22,10 @@
//! vector are also provided: //! vector are also provided:
//! //!
//! ```rust //! ```rust
//! use cgmath::{Vector, Vector2, Vector3, Vector4, vec2, vec3}; //! use cgmath::{Vector, Vector2, Vector3, Vector4, vec3};
//! //!
//! assert_eq!(Vector2::new(1.0f64, 0.0f64), Vector2::unit_x()); //! assert_eq!(Vector2::new(1.0f64, 0.0f64), Vector2::unit_x());
//! assert_eq!(vec3(0.0f64, 0.0f64, 0.0f64), Vector3::zero()); //! assert_eq!(vec3(0.0f64, 0.0f64, 0.0f64), Vector3::zero());
//! assert_eq!(Vector2::from_value(1.0f64), vec2(1.0, 1.0));
//! ``` //! ```
//! //!
//! Vectors can be manipulated with typical mathematical operations (addition, //! Vectors can be manipulated with typical mathematical operations (addition,
@ -157,17 +156,6 @@ pub trait Vector: Copy + Clone where
/// The associated scalar. /// The associated scalar.
type Scalar: BaseNum; type Scalar: BaseNum;
/// Construct a vector from a single value, replicating it.
///
/// ```rust
/// use cgmath::prelude::*;
/// use cgmath::Vector3;
///
/// assert_eq!(Vector3::from_value(1),
/// Vector3::new(1, 1, 1));
/// ```
fn from_value(scalar: Self::Scalar) -> Self;
/// The additive identity. /// The additive identity.
/// ///
/// Adding this to another `Self` value has no effect. /// Adding this to another `Self` value has no effect.
@ -179,8 +167,7 @@ pub trait Vector: Copy + Clone where
/// let v = Vector2::new(1, 2); /// let v = Vector2::new(1, 2);
/// assert_eq!(v + Vector2::zero(), v); /// assert_eq!(v + Vector2::zero(), v);
/// ``` /// ```
#[inline] fn zero() -> Self;
fn zero() -> Self { Self::from_value(Self::Scalar::zero()) }
} }
/// A 2-dimensional vector. /// A 2-dimensional vector.
@ -252,18 +239,38 @@ macro_rules! impl_vector {
impl<S: Copy> Array for $VectorN<S> { impl<S: Copy> Array for $VectorN<S> {
type Element = S; type Element = S;
#[inline] fn sum(self) -> S where S: Add<Output = S> { fold_array!(add, { $(self.$field),+ }) } #[inline]
#[inline] fn product(self) -> S where S: Mul<Output = S> { fold_array!(mul, { $(self.$field),+ }) } fn from_value(scalar: S) -> $VectorN<S> {
#[inline] fn min(self) -> S where S: PartialOrd { fold_array!(partial_min, { $(self.$field),+ }) } $VectorN { $($field: scalar),+ }
#[inline] fn max(self) -> S where S: PartialOrd { fold_array!(partial_max, { $(self.$field),+ }) } }
#[inline]
fn sum(self) -> S where S: Add<Output = S> {
fold_array!(add, { $(self.$field),+ })
}
#[inline]
fn product(self) -> S where S: Mul<Output = S> {
fold_array!(mul, { $(self.$field),+ })
}
#[inline]
fn min(self) -> S where S: PartialOrd {
fold_array!(partial_min, { $(self.$field),+ })
}
#[inline]
fn max(self) -> S where S: PartialOrd {
fold_array!(partial_max, { $(self.$field),+ })
}
} }
impl<S: BaseNum> Vector for $VectorN<S> { impl<S: BaseNum> Vector for $VectorN<S> {
type Scalar = S; type Scalar = S;
#[inline] #[inline]
fn from_value(scalar: S) -> $VectorN<S> { fn zero() -> Self {
$VectorN { $($field: scalar),+ } Self::from_value(Self::Scalar::zero())
} }
} }