Merge branch 'master' of gitlab.com:CyberMages/sigils
Conflicts: src/number.rs
This commit is contained in:
		
							
								
								
									
										14
									
								
								examples/quaternion.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								examples/quaternion.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | extern crate sigils; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | use sigils::quaternion::{Quaternion}; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | pub fn main() | ||||||
|  | { | ||||||
|  |    let quat: Quaternion<f64>; | ||||||
|  |  | ||||||
|  |    quat = Quaternion::<f64>::default(); | ||||||
|  |    println!("Quaternion: {}", quat); | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								examples/vector.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								examples/vector.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | extern crate sigils; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | use sigils::vector::{Vector2, Vector3, Vector4}; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | pub fn main() | ||||||
|  | { | ||||||
|  |    let vec2: Vector2<f64>; | ||||||
|  |    let vec3: Vector3<f64>; | ||||||
|  |    let vec4: Vector4<f64>; | ||||||
|  |  | ||||||
|  |    vec2 = Vector2::<f64>::default(); | ||||||
|  |    println!("Vector2: {}", vec2); | ||||||
|  |  | ||||||
|  |    vec3 = Vector3::<f64>::default(); | ||||||
|  |    println!("Vector3: {}", vec3); | ||||||
|  |  | ||||||
|  |    vec4 = Vector4::<f64>::default(); | ||||||
|  |    println!("Vector4: {}", vec4); | ||||||
|  | } | ||||||
| @ -22,7 +22,7 @@ use super::number::Number; | |||||||
| /// [10]: https://doc.rust-lang.org/std/primitive.i64.html | /// [10]: https://doc.rust-lang.org/std/primitive.i64.html | ||||||
| /// [11]: https://doc.rust-lang.org/std/primitive.isize.html | /// [11]: https://doc.rust-lang.org/std/primitive.isize.html | ||||||
| /// [12]: https://doc.rust-lang.org/std/index.html | /// [12]: https://doc.rust-lang.org/std/index.html | ||||||
| pub trait Integer : Number | pub trait Integer: Number | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
| @ -2,12 +2,12 @@ | |||||||
| //! License: Proprietary | //! License: Proprietary | ||||||
| //! | //! | ||||||
| //! | //! | ||||||
| #![feature(zero_one)] |  | ||||||
| #![feature(float_from_str_radix)] |  | ||||||
| #![feature(float_extras)] | #![feature(float_extras)] | ||||||
| #![feature(associated_consts)] | #![feature(associated_consts)] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | mod zero; | ||||||
|  | mod one; | ||||||
| mod bounded; | mod bounded; | ||||||
| mod number; | mod number; | ||||||
| mod whole; | mod whole; | ||||||
| @ -21,6 +21,8 @@ pub mod matrix; | |||||||
| pub mod quaternion; | pub mod quaternion; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | pub use self::zero::Zero; | ||||||
|  | pub use self::one::One; | ||||||
| pub use self::number::Number; | pub use self::number::Number; | ||||||
| pub use self::whole::Whole; | pub use self::whole::Whole; | ||||||
| pub use self::integer::Integer; | pub use self::integer::Integer; | ||||||
|  | |||||||
| @ -1,9 +1,10 @@ | |||||||
| //! This module defines the 2x2, 3x3, and 4x4 Matrix structures. | //! This module defines the 2x2, 3x3, and 4x4 Matrix structures. | ||||||
| use std::num::{Zero, One}; |  | ||||||
| use std::ops::{Add, Sub, Mul, Div, Rem, Neg}; | use std::ops::{Add, Sub, Mul, Div, Rem, Neg}; | ||||||
|  |  | ||||||
| use super::number::Number; | use ::zero::Zero; | ||||||
| use super::vector::{Vector, Vector2, Vector3, Vector4}; | use ::one::One; | ||||||
|  | use ::number::Number; | ||||||
|  | use ::vector::{Vector, Vector2, Vector3, Vector4}; | ||||||
|  |  | ||||||
|  |  | ||||||
| /// A trait that defines the minimum set of | /// A trait that defines the minimum set of | ||||||
|  | |||||||
| @ -1,10 +1,13 @@ | |||||||
| use std::cmp::PartialEq; | use std::cmp::PartialEq; | ||||||
|  | use std::fmt::{Debug, Display}; | ||||||
| use std::mem::size_of; | use std::mem::size_of; | ||||||
| use std::num::{Zero, One}; |  | ||||||
| use std::ops::{Add, Sub, Mul, Div, Rem}; | use std::ops::{Add, Sub, Mul, Div, Rem}; | ||||||
| use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; | use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; | ||||||
|  | use std::str::FromStr; | ||||||
|  |  | ||||||
| use super::bounded::Bounded; | use ::zero::Zero; | ||||||
|  | use ::one::One; | ||||||
|  | use ::bounded::Bounded; | ||||||
|  |  | ||||||
|  |  | ||||||
| /// A trait that defines what is required to be considered | /// A trait that defines what is required to be considered | ||||||
| @ -13,10 +16,11 @@ pub trait Number : Zero + One + Add<Output=Self> + Sub<Output=Self> + | |||||||
|                    Mul<Output=Self> + Div<Output=Self> + Rem<Output=Self> + |                    Mul<Output=Self> + Div<Output=Self> + Rem<Output=Self> + | ||||||
|                    AddAssign<Self> + SubAssign<Self> + MulAssign<Self> + |                    AddAssign<Self> + SubAssign<Self> + MulAssign<Self> + | ||||||
|                    DivAssign<Self> + RemAssign<Self> + PartialEq + |                    DivAssign<Self> + RemAssign<Self> + PartialEq + | ||||||
|                    Copy + Clone |                    Copy + Clone + Debug + Display | ||||||
| { | { | ||||||
|    type StrRadixError; |    type StrRadixError; | ||||||
|  |  | ||||||
|  |  | ||||||
|    /// Create a number from a given string and base radix. |    /// Create a number from a given string and base radix. | ||||||
|    /// |    /// | ||||||
|    ///``` |    ///``` | ||||||
| @ -751,6 +755,7 @@ macro_rules! int_number_trait_impl | |||||||
|       { |       { | ||||||
|          type StrRadixError = ::std::num::ParseIntError; |          type StrRadixError = ::std::num::ParseIntError; | ||||||
|  |  | ||||||
|  |  | ||||||
|          fn from_str_radix(src: &str, radix: u32) -> |          fn from_str_radix(src: &str, radix: u32) -> | ||||||
|             Result<Self, ::std::num::ParseIntError> |             Result<Self, ::std::num::ParseIntError> | ||||||
|          { |          { | ||||||
| @ -764,16 +769,23 @@ macro_rules! int_number_trait_impl | |||||||
| /// base float types in rust. | /// base float types in rust. | ||||||
| macro_rules! float_number_trait_impl | macro_rules! float_number_trait_impl | ||||||
| { | { | ||||||
|    ($traitName: ident for $($varType: ty)*) => |    ($traitName: ident for $($varType: ty, $numBytes: expr)*) => | ||||||
|    ($( |    ($( | ||||||
|       impl $traitName for $varType |       impl $traitName for $varType | ||||||
|       { |       { | ||||||
|          type StrRadixError = ::std::num::ParseFloatError; |          type StrRadixError = ::std::num::ParseFloatError; | ||||||
|  |  | ||||||
|  |  | ||||||
|          fn from_str_radix(src: &str, radix: u32) -> |          fn from_str_radix(src: &str, radix: u32) -> | ||||||
|             Result<Self, ::std::num::ParseFloatError> |             Result<Self, ::std::num::ParseFloatError> | ||||||
|          { |          { | ||||||
|             <$varType>::from_str_radix(src, radix) |             // TODO: Currently this will panic on a non base 10 radix. | ||||||
|  |             //       This is because the std library deprecated the | ||||||
|  |             //       from_str_radix function. Until a function can be | ||||||
|  |             //       written this will use the from_str function and | ||||||
|  |             //       panic for non base 10 requests. | ||||||
|  |             assert!(radix == 10); | ||||||
|  |             <$varType>::from_str(src) | ||||||
|          } |          } | ||||||
|       } |       } | ||||||
|    )*) |    )*) | ||||||
| @ -783,7 +795,7 @@ macro_rules! float_number_trait_impl | |||||||
| // Implement the Number trait for the types that are Numbers. | // Implement the Number trait for the types that are Numbers. | ||||||
| int_number_trait_impl!(Number for u8 u16 u32 u64 usize); | int_number_trait_impl!(Number for u8 u16 u32 u64 usize); | ||||||
| int_number_trait_impl!(Number for i8 i16 i32 i64 isize); | int_number_trait_impl!(Number for i8 i16 i32 i64 isize); | ||||||
| float_number_trait_impl!(Number for f32 f64); | float_number_trait_impl!(Number for f32, 4 f64, 8); | ||||||
|  |  | ||||||
| // Implement the ToNumber and FromNumber traits for | // Implement the ToNumber and FromNumber traits for | ||||||
| // the types that are Numbers. The FromNumber trait needs | // the types that are Numbers. The FromNumber trait needs | ||||||
|  | |||||||
							
								
								
									
										54
									
								
								src/one.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/one.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | use std::ops::Mul; | ||||||
|  |  | ||||||
|  | /// Defines a multiplicative identity element for `Self`. | ||||||
|  | pub trait One: Sized + Mul<Self, Output=Self> | ||||||
|  | { | ||||||
|  |    /// Returns the multiplicative identity element of `Self`, `1`. | ||||||
|  |    /// | ||||||
|  |    /// # Laws | ||||||
|  |    /// | ||||||
|  |    /// ```{.text} | ||||||
|  |    /// a * 1 = a       ∀ a ∈ Self | ||||||
|  |    /// 1 * a = a       ∀ a ∈ Self | ||||||
|  |    /// ``` | ||||||
|  |    /// | ||||||
|  |    /// # Purity | ||||||
|  |    /// | ||||||
|  |    /// This function should return the same result at all times regardless of | ||||||
|  |    /// external mutable state, for example values stored in TLS or in | ||||||
|  |    /// `static mut`s. | ||||||
|  |    fn one() -> Self; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | macro_rules! one_impl | ||||||
|  | { | ||||||
|  |    ($varType: ty, $val: expr) => | ||||||
|  |    { | ||||||
|  |       impl One for $varType | ||||||
|  |       { | ||||||
|  |          fn one() -> $varType | ||||||
|  |          { | ||||||
|  |             $val | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | one_impl!(u8, 1u8); | ||||||
|  | one_impl!(u16, 1u16); | ||||||
|  | one_impl!(u32, 1u32); | ||||||
|  | one_impl!(u64, 1u64); | ||||||
|  | one_impl!(usize, 1usize); | ||||||
|  |  | ||||||
|  | one_impl!(i8, 1i8); | ||||||
|  | one_impl!(i16, 1i16); | ||||||
|  | one_impl!(i32, 1i32); | ||||||
|  | one_impl!(i64, 1i64); | ||||||
|  | one_impl!(isize, 1isize); | ||||||
|  |  | ||||||
|  | one_impl!(f32, 1.0f32); | ||||||
|  | one_impl!(f64, 1.0f64); | ||||||
| @ -3,11 +3,13 @@ | |||||||
| //! | //! | ||||||
| //! [1]: https://en.wikipedia.org/wiki/Quaternion | //! [1]: https://en.wikipedia.org/wiki/Quaternion | ||||||
| //! [2]: https://en.wikipedia.org/wiki/Dual_quaternion | //! [2]: https://en.wikipedia.org/wiki/Dual_quaternion | ||||||
| use std::num::{Zero, One}; | use std::fmt::{Error, Formatter, Debug, Display}; | ||||||
| use std::ops::{Add, Sub, Mul, Div, Neg}; | use std::ops::{Add, Sub, Mul, Div, Neg}; | ||||||
|  |  | ||||||
| use super::real::Real; | use ::zero::Zero; | ||||||
| use super::vector::{Vector, EuclideanVector, Vector3}; | use ::one::One; | ||||||
|  | use ::real::Real; | ||||||
|  | use ::vector::{Vector, EuclideanVector, Vector3}; | ||||||
|  |  | ||||||
|  |  | ||||||
| /// A Quaternion is a combination of a scalar and a vector | /// A Quaternion is a combination of a scalar and a vector | ||||||
| @ -274,6 +276,34 @@ impl<T> Quaternion<T> where T: Real | |||||||
|    // TODO: Add binary operations for editing self. |    // TODO: Add binary operations for editing self. | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Implement the Debug trait for the Quaternion. | ||||||
|  | impl<T> Debug for Quaternion<T> where T: Real | ||||||
|  | { | ||||||
|  |    fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> | ||||||
|  |    { | ||||||
|  |       write!(formatter, "[{:?}, {:?}]", self.scalar, self.vector) | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Implement the Display trait for the Quaternion. | ||||||
|  | impl<T> Display for Quaternion<T> where T: Real | ||||||
|  | { | ||||||
|  |    fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> | ||||||
|  |    { | ||||||
|  |       write!(formatter, "[{}, {}]", self.scalar, self.vector) | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Implement a default value for Quaternions which | ||||||
|  | // returns the identity quaternion. | ||||||
|  | impl<T> Default for Quaternion<T> where T: Real | ||||||
|  | { | ||||||
|  |    fn default() -> Quaternion<T> | ||||||
|  |    { | ||||||
|  |       Quaternion::identity() | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
| // Implement the Zero and One traits for the Quaternion. | // Implement the Zero and One traits for the Quaternion. | ||||||
| impl<T> Zero for Quaternion<T> where T: Real | impl<T> Zero for Quaternion<T> where T: Real | ||||||
| { | { | ||||||
|  | |||||||
| @ -1,20 +1,24 @@ | |||||||
| //! This module defines 2, 3, and 4 component [Vector][1] structures. | //! This module defines 2, 3, and 4 component [Vector][1] structures. | ||||||
| //! | //! | ||||||
| //! [1]: https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics) | //! [1]: https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics) | ||||||
| use std::num::{Zero, One}; | use std::fmt::{Error, Formatter, Debug, Display}; | ||||||
| use std::ops::{Add, Sub, Mul, Div, Rem, Neg}; | use std::ops::{Add, Sub, Mul, Div, Rem, Neg}; | ||||||
| use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; | use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign}; | ||||||
|  |  | ||||||
| use super::number::Number; | use ::zero::Zero; | ||||||
| use super::real::Real; | use ::one::One; | ||||||
| use super::trig::{acos, atan2}; | use ::number::Number; | ||||||
|  | use ::real::Real; | ||||||
|  | use ::trig::{acos, atan2}; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /// A trait that defines the minimum set of | /// A trait that defines the minimum set of | ||||||
| /// functions a [Vector][1] must implement. | /// functions a [Vector][1] must implement. | ||||||
| /// | /// | ||||||
| /// [1]: https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics) | /// [1]: https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics) | ||||||
| pub trait Vector<T> : Clone where T: Number | pub trait Vector<T>: Debug + Display + Clone + Default + Zero + One | ||||||
|  |    where T: Number | ||||||
| { | { | ||||||
|    // Creation functions. |    // Creation functions. | ||||||
|    /// Create a Vector from a single value. |    /// Create a Vector from a single value. | ||||||
| @ -48,6 +52,12 @@ pub trait Vector<T> : Clone where T: Number | |||||||
|    } |    } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    // Property functions. | ||||||
|  |    /// Returns the size, how many components the Vector | ||||||
|  |    /// has, of this Vector. | ||||||
|  |    fn get_size(&self) -> u8; | ||||||
|  |  | ||||||
|  |  | ||||||
|    // Scalar operations that change this Vector. |    // Scalar operations that change this Vector. | ||||||
|    /// Add a scalar value to this Vector. |    /// Add a scalar value to this Vector. | ||||||
|    /// |    /// | ||||||
| @ -554,7 +564,7 @@ macro_rules! binary_operator_assign_impl | |||||||
| /// that implements the Vector trait. | /// that implements the Vector trait. | ||||||
| macro_rules! define_vector | macro_rules! define_vector | ||||||
| { | { | ||||||
|    ($structName: ident <$T: ident> {$($field: ident),+}) => |    ($structName: ident <$T: ident> {$($field: ident),+}, $field_count: expr) => | ||||||
|    { |    { | ||||||
|       // Do not add a where clause here or implementing |       // Do not add a where clause here or implementing | ||||||
|       // generic traits were the generic is different |       // generic traits were the generic is different | ||||||
| @ -601,6 +611,11 @@ macro_rules! define_vector | |||||||
|             $structName {$($field: val),+} |             $structName {$($field: val),+} | ||||||
|          } |          } | ||||||
|  |  | ||||||
|  |          fn get_size(&self) -> u8 | ||||||
|  |          { | ||||||
|  |             $field_count | ||||||
|  |          } | ||||||
|  |  | ||||||
|          fn add_scalar(&mut self, scalar: T) |          fn add_scalar(&mut self, scalar: T) | ||||||
|          { |          { | ||||||
|             *self = &*self + scalar; |             *self = &*self + scalar; | ||||||
| @ -669,6 +684,63 @@ macro_rules! define_vector | |||||||
|          } |          } | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       // Implement the Debug trait for the Vector. | ||||||
|  |       impl<T> Debug for $structName<T> where T: Number | ||||||
|  |       { | ||||||
|  |          fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> | ||||||
|  |          { | ||||||
|  |             let mut count: u8; | ||||||
|  |  | ||||||
|  |             // Use the size of the Vector to | ||||||
|  |             // pretty up the printing. | ||||||
|  |             count = self.get_size(); | ||||||
|  |  | ||||||
|  |             write!(formatter, "<"); | ||||||
|  |             $( | ||||||
|  |                write!(formatter, "{:?}", self.$field); | ||||||
|  |                if count > 0 | ||||||
|  |                { | ||||||
|  |                   write!(formatter, ", "); | ||||||
|  |                } | ||||||
|  |                count -= 1; | ||||||
|  |             )* | ||||||
|  |             write!(formatter, ">") | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Implement the Display trait for the Vector. | ||||||
|  |       impl<T> Display for $structName<T> where T: Number | ||||||
|  |       { | ||||||
|  |          fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> | ||||||
|  |          { | ||||||
|  |             let mut count: u8; | ||||||
|  |  | ||||||
|  |             // Use the size of the Vector to | ||||||
|  |             // pretty up the printing. | ||||||
|  |             count = self.get_size(); | ||||||
|  |  | ||||||
|  |             write!(formatter, "<"); | ||||||
|  |             $( | ||||||
|  |                write!(formatter, "{}", self.$field); | ||||||
|  |                if count > 1 | ||||||
|  |                { | ||||||
|  |                   write!(formatter, ", "); | ||||||
|  |                } | ||||||
|  |                count -= 1; | ||||||
|  |             )* | ||||||
|  |             write!(formatter, ">") | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Implement the Default trait for the Vector. | ||||||
|  |       impl<T> Default for $structName<T> where T: Number | ||||||
|  |       { | ||||||
|  |          fn default() -> $structName<T> | ||||||
|  |          { | ||||||
|  |             $structName::identity() | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|       // Implement the Zero and One traits for the Vector. |       // Implement the Zero and One traits for the Vector. | ||||||
|       impl<T> Zero for $structName<T> where T: Number |       impl<T> Zero for $structName<T> where T: Number | ||||||
|       { |       { | ||||||
| @ -720,9 +792,9 @@ macro_rules! define_vector | |||||||
|  |  | ||||||
|  |  | ||||||
| // Define the Vector2, Vector3, and Vector4 structures. | // Define the Vector2, Vector3, and Vector4 structures. | ||||||
| define_vector!(Vector2<T> {x, y}); | define_vector!(Vector2<T> {x, y}, 2u8); | ||||||
| define_vector!(Vector3<T> {x, y, z}); | define_vector!(Vector3<T> {x, y, z}, 3u8); | ||||||
| define_vector!(Vector4<T> {x, y, z, w}); | define_vector!(Vector4<T> {x, y, z, w}, 4u8); | ||||||
|  |  | ||||||
|  |  | ||||||
| // Implements operations specific to the different | // Implements operations specific to the different | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ use super::number::Number; | |||||||
| /// [5]: https://doc.rust-lang.org/std/primitive.u64.html | /// [5]: https://doc.rust-lang.org/std/primitive.u64.html | ||||||
| /// [6]: https://doc.rust-lang.org/std/primitive.usize.html | /// [6]: https://doc.rust-lang.org/std/primitive.usize.html | ||||||
| /// [7]: https://doc.rust-lang.org/std/index.html | /// [7]: https://doc.rust-lang.org/std/index.html | ||||||
| pub trait Whole : Number | pub trait Whole: Number | ||||||
| { | { | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										54
									
								
								src/zero.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/zero.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | use std::ops::Add; | ||||||
|  |  | ||||||
|  | /// Defines an additive identity element for `Self`. | ||||||
|  | pub trait Zero: Sized + Add<Self, Output=Self> | ||||||
|  | { | ||||||
|  |    /// Returns the additive identity element of `Self`, `0`. | ||||||
|  |    /// | ||||||
|  |    /// # Laws | ||||||
|  |    /// | ||||||
|  |    /// ```{.text} | ||||||
|  |    /// a + 0 = a       ∀ a ∈ Self | ||||||
|  |    /// 0 + a = a       ∀ a ∈ Self | ||||||
|  |    /// ``` | ||||||
|  |    /// | ||||||
|  |    /// # Purity | ||||||
|  |    /// | ||||||
|  |    /// This function should return the same result at all times regardless of | ||||||
|  |    /// external mutable state, for example values stored in TLS or in | ||||||
|  |    /// `static mut`s. | ||||||
|  |    fn zero() -> Self; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | macro_rules! zero_impl | ||||||
|  | { | ||||||
|  |    ($varType: ty, $val: expr) => | ||||||
|  |    { | ||||||
|  |       impl Zero for $varType | ||||||
|  |       { | ||||||
|  |          fn zero() -> $varType | ||||||
|  |          { | ||||||
|  |             $val | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | zero_impl!(u8, 0u8); | ||||||
|  | zero_impl!(u16, 0u16); | ||||||
|  | zero_impl!(u32, 0u32); | ||||||
|  | zero_impl!(u64, 0u64); | ||||||
|  | zero_impl!(usize, 0usize); | ||||||
|  |  | ||||||
|  | zero_impl!(i8, 0i8); | ||||||
|  | zero_impl!(i16, 0i16); | ||||||
|  | zero_impl!(i32, 0i32); | ||||||
|  | zero_impl!(i64, 0i64); | ||||||
|  | zero_impl!(isize, 0isize); | ||||||
|  |  | ||||||
|  | zero_impl!(f32, 0.0f32); | ||||||
|  | zero_impl!(f64, 0.0f64); | ||||||
		Reference in New Issue
	
	Block a user