diff --git a/src/size.rs b/src/size.rs index a5c9fa7..60b3249 100644 --- a/src/size.rs +++ b/src/size.rs @@ -13,7 +13,7 @@ use scale_factor::ScaleFactor; use vector::{TypedVector2D, vec2}; use num::*; -use num_traits::NumCast; +use num_traits::{NumCast, Signed}; use std::fmt; use std::ops::{Add, Div, Mul, Sub}; use std::marker::PhantomData; @@ -245,6 +245,17 @@ impl TypedSize2D { } } +impl TypedSize2D +where T: Signed { + pub fn abs(&self) -> Self { + size2(self.width.abs(), self.height.abs()) + } + + pub fn is_positive(&self) -> bool { + self.width.is_positive() && self.height.is_positive() + } +} + /// Shorthand for `TypedSize2D::new(w, h)`. pub fn size2(w: T, h: T) -> TypedSize2D { TypedSize2D::new(w, h) diff --git a/src/vector.rs b/src/vector.rs index 0fa3f08..51255e7 100644 --- a/src/vector.rs +++ b/src/vector.rs @@ -14,7 +14,7 @@ use point::{TypedPoint2D, TypedPoint3D, point2, point3}; use size::{TypedSize2D, size2}; use scale_factor::ScaleFactor; use num::*; -use num_traits::{Float, NumCast}; +use num_traits::{Float, NumCast, Signed}; use std::fmt; use std::ops::{Add, Neg, Mul, Sub, Div, AddAssign, SubAssign, MulAssign, DivAssign}; use std::marker::PhantomData; @@ -58,13 +58,15 @@ impl fmt::Display for TypedVector2D { } } -impl TypedVector2D { +impl TypedVector2D { /// Constructor taking scalar values directly. #[inline] pub fn new(x: T, y: T) -> Self { TypedVector2D { x: x, y: y, _unit: PhantomData } } +} +impl TypedVector2D { /// Constructor taking properly typed Lengths instead of scalar values. #[inline] pub fn from_lengths(x: Length, y: Length) -> Self { @@ -384,6 +386,13 @@ impl From<[T; 2]> for TypedVector2D { } } +impl TypedVector2D +where T: Signed { + pub fn abs(&self) -> Self { + vec2(self.x.abs(), self.y.abs()) + } +} + define_matrix! { /// A 3d Vector tagged with a unit. pub struct TypedVector3D { @@ -423,13 +432,15 @@ impl fmt::Display for TypedVector3D { } } -impl TypedVector3D { +impl TypedVector3D { /// Constructor taking scalar values directly. #[inline] pub fn new(x: T, y: T, z: T) -> Self { TypedVector3D { x: x, y: y, z: z, _unit: PhantomData } } +} +impl TypedVector3D { /// Constructor taking properly typed Lengths instead of scalar values. #[inline] pub fn from_lengths(x: Length, y: Length, z: Length) -> TypedVector3D { @@ -753,16 +764,22 @@ impl From<[T; 3]> for TypedVector3D { } } +impl TypedVector3D +where T: Signed { + pub fn abs(&self) -> Self { + vec3(self.x.abs(), self.y.abs(), self.z.abs()) + } +} /// Convenience constructor. #[inline] -pub fn vec2(x: T, y: T) -> TypedVector2D { +pub fn vec2(x: T, y: T) -> TypedVector2D { TypedVector2D::new(x, y) } /// Convenience constructor. #[inline] -pub fn vec3(x: T, y: T, z: T) -> TypedVector3D { +pub fn vec3(x: T, y: T, z: T) -> TypedVector3D { TypedVector3D::new(x, y, z) }