Tue, 31 Dec 2024 09:12:43 -0500
Try to have Field as member type in Mappings etc.
| 5 | 1 | /*! |
| 2 | Some useful (numerical) types and traits. | |
| 3 | ||
| 4 | The traits are based on corresponding ones in [`num_traits`], but try to fill some gaps in the | |
| 5 | super-traits and available constants. | |
| 0 | 6 | |
| 5 | 7 | As [`nalgebra`] unnecessarily provides many of the same methods as [`num_traits`], to avoid having |
| 8 | to refer to the methods with the full path, it is often necesary to use [`ToNalgebraRealField`][crate::nalgebra_support::ToNalgebraRealField] to hide the nalgebra implementations until | |
| 9 | absolutely necessary to use nalgebra. | |
| 10 | */ | |
| 11 | ||
| 12 | //use trait_set::trait_set; | |
| 0 | 13 | pub use num_traits::Float as NumTraitsFloat; // needed to re-export functions. |
| 14 | pub use num_traits::cast::AsPrimitive; | |
| 15 | ||
| 16 | /// Typical integer type | |
| 17 | #[allow(non_camel_case_types)] | |
| 18 | pub type int = i64; | |
| 19 | ||
| 20 | /// Typical unsigned integer type | |
| 21 | #[allow(non_camel_case_types)] | |
| 22 | pub type uint = u64; | |
| 23 | ||
| 24 | /// Typical floating point number type | |
| 25 | #[allow(non_camel_case_types)] | |
| 26 | pub type float = f64; | |
| 27 | ||
| 28 | /// Casts of abstract numerical types to others via the standard `as` keyword. | |
| 29 | pub trait CastFrom<T : 'static + Copy> : num_traits::cast::AsPrimitive<T> { | |
| 30 | fn cast_from(other : T) -> Self; | |
| 31 | } | |
| 32 | ||
| 33 | macro_rules! impl_casts { | |
| 34 | ($($type:ty)*) => { $( | |
| 35 | impl_casts!(@phase2, $type, | |
| 36 | u8 u16 u32 u64 u128 usize | |
| 37 | i8 i16 i32 i64 i128 isize | |
| 38 | f32 f64); | |
| 39 | )* }; | |
| 40 | (@phase2, $type:ty, $($type2:ty)*) => { $( | |
| 41 | impl CastFrom<$type2> for $type { | |
| 42 | #[inline] | |
| 43 | fn cast_from(other : $type2) -> Self { other as $type } | |
| 44 | } | |
| 45 | )* }; | |
| 46 | } | |
| 47 | ||
| 48 | impl_casts!(u8 u16 u32 u64 u128 usize | |
| 49 | i8 i16 i32 i64 i128 isize | |
| 50 | f32 f64); | |
| 51 | ||
| 5 | 52 | /// Trait for general numeric types |
|
8
4e09b7829b51
Multithreaded bisection tree operations
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
53 | pub trait Num : 'static + Copy + Sync + Send + num::Num + num_traits::NumAssign |
| 0 | 54 | + std::iter::Sum + std::iter::Product |
| 55 | + std::fmt::Debug + std::fmt::Display + serde::Serialize | |
| 56 | + CastFrom<u8> + CastFrom<u16> + CastFrom<u32> + CastFrom<u64> | |
| 57 | + CastFrom<u128> + CastFrom<usize> | |
| 58 | + CastFrom<i8> + CastFrom<i16> + CastFrom<i32> + CastFrom<i64> | |
| 59 | + CastFrom<i128> + CastFrom<isize> | |
|
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
60 | + CastFrom<f32> + CastFrom<f64> |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
61 | + HasScalarField<Field = Self> { |
| 0 | 62 | |
| 63 | const ZERO : Self; | |
| 64 | const ONE : Self; | |
| 65 | const TWO : Self; | |
|
8
4e09b7829b51
Multithreaded bisection tree operations
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
66 | /// Generic version of `Self::MAX` |
| 0 | 67 | const RANGE_MAX : Self; |
|
8
4e09b7829b51
Multithreaded bisection tree operations
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
68 | /// Generic version of `Self::MIN` |
| 0 | 69 | const RANGE_MIN : Self; |
| 70 | } | |
| 71 | ||
| 72 | /// Trait for signed numeric types | |
| 73 | pub trait SignedNum : Num + num::Signed + std::ops::Neg<Output=Self> {} | |
| 74 | impl<U : Num + num::Signed + std::ops::Neg<Output=Self>> SignedNum for U { } | |
| 75 | ||
| 76 | /// Trait for floating point numbers | |
| 5 | 77 | pub trait Float : SignedNum + num::Float /*+ From<Self::CompatibleSize>*/ { |
| 78 | // An unsigned integer that can be used for indexing operations and | |
| 79 | // converted to F without loss. | |
| 80 | //type CompatibleSize : CompatibleUnsigned<Self>; | |
| 0 | 81 | |
| 82 | const PI : Self; | |
| 83 | const E : Self; | |
| 84 | const EPSILON : Self; | |
| 85 | const SQRT_2 : Self; | |
| 86 | const INFINITY : Self; | |
| 87 | const NEG_INFINITY : Self; | |
| 32 | 88 | const NAN : Self; |
| 0 | 89 | const FRAC_2_SQRT_PI : Self; |
| 90 | } | |
| 91 | ||
| 92 | /// Trait for integers | |
| 93 | pub trait Integer : Num + num::Integer {} | |
| 94 | ||
| 95 | /// Trait for unsigned integers | |
| 96 | pub trait Unsigned : Num + Integer + num::Unsigned {} | |
| 97 | ||
| 98 | /// Trait for signed integers | |
| 99 | pub trait Signed : SignedNum + Integer {} | |
| 100 | ||
| 101 | macro_rules! impl_num_consts { | |
| 102 | ($($type:ty)*) => { $( | |
| 103 | impl Num for $type { | |
| 104 | const ZERO : Self = 0 as $type; | |
| 105 | const ONE : Self = 1 as $type; | |
| 106 | const TWO : Self = 2 as $type; | |
| 107 | const RANGE_MAX : Self = <$type>::MAX; | |
| 108 | const RANGE_MIN : Self = <$type>::MIN; | |
| 109 | } | |
|
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
110 | impl HasScalarField for $type { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
111 | type Field = $type; |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
112 | } |
| 0 | 113 | )* } |
| 114 | } | |
| 115 | ||
| 116 | macro_rules! impl_integers { | |
| 117 | ($signed:ty : $($type:ty)*) => { $( | |
| 118 | impl_num_consts!($type); | |
| 119 | impl Integer for $type {} | |
| 120 | impl $signed for $type {} | |
| 121 | )* } | |
| 122 | } | |
| 123 | ||
| 124 | impl_integers!(Signed: i8 i16 i32 i64 i128 isize); | |
| 125 | impl_integers!(Unsigned: u8 u16 u32 u64 u128 usize); | |
| 126 | ||
| 127 | impl_num_consts!(f32 f64); | |
| 128 | ||
| 129 | impl Float for f64 { | |
| 5 | 130 | /*#[cfg(any(target_pointer_width = "128", target_pointer_width = "64"))] |
| 0 | 131 | type CompatibleSize = u32; |
| 132 | #[cfg(any(target_pointer_width = "32", target_pointer_width = "16"))] | |
| 5 | 133 | type CompatibleSize = usize;*/ |
| 0 | 134 | |
| 135 | const PI : Self = std::f64::consts::PI; | |
| 136 | const E : Self = std::f64::consts::E; | |
| 137 | const EPSILON : Self = std::f64::EPSILON; | |
| 138 | const SQRT_2 : Self = std::f64::consts::SQRT_2; | |
| 139 | const INFINITY : Self = std::f64::INFINITY; | |
| 140 | const NEG_INFINITY : Self = std::f64::NEG_INFINITY; | |
| 32 | 141 | const NAN : Self = std::f64::NAN; |
| 0 | 142 | const FRAC_2_SQRT_PI : Self = std::f64::consts::FRAC_2_SQRT_PI; |
| 143 | } | |
| 144 | ||
| 145 | impl Float for f32 { | |
| 5 | 146 | /* |
| 0 | 147 | #[cfg(any(target_pointer_width = "128", target_pointer_width = "64", target_pointer_width = "32"))] |
| 148 | type CompatibleSize = u16; | |
| 149 | #[cfg(any(target_pointer_width = "16"))] | |
| 150 | type CompatibleSize = usize; | |
| 5 | 151 | */ |
| 0 | 152 | |
| 153 | const PI : Self = std::f32::consts::PI; | |
| 154 | const E : Self = std::f32::consts::E; | |
| 155 | const EPSILON : Self = std::f32::EPSILON; | |
| 156 | const SQRT_2 : Self = std::f32::consts::SQRT_2; | |
| 157 | const INFINITY : Self = std::f32::INFINITY; | |
| 158 | const NEG_INFINITY : Self = std::f32::NEG_INFINITY; | |
| 32 | 159 | const NAN : Self = std::f32::NAN; |
| 0 | 160 | const FRAC_2_SQRT_PI : Self = std::f32::consts::FRAC_2_SQRT_PI; |
| 161 | } | |
| 162 | ||
| 5 | 163 | /* |
| 0 | 164 | trait_set! { |
| 165 | pub trait CompatibleUnsigned<F : Float> = Unsigned + Into<F>; | |
| 166 | pub trait CompatibleSigned<F : Float> = Signed + Into<F>; | |
| 167 | } | |
| 5 | 168 | */ |
|
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
169 | |
|
81
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
170 | |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
171 | /// Trait for on-demand cloning as of `Self` as `Target`. |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
172 | /// |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
173 | /// Blanket implementations clone references, but do nothing if `Self` equals `Target`. |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
174 | /// |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
175 | /// The idea is to allow other traits to be implemented generically, similar to now one |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
176 | /// can work with references and owned values through [`std::borrow::Borrow`], but, in |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
177 | /// contrast to the latter, this trait will provide an owned value instead of reference. |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
178 | pub trait CloneIfNeeded<Target> { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
179 | /// Clone `self` if needed as `Target`. |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
180 | fn clone_if_needed(self) -> Target; |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
181 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
182 | |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
183 | impl<'a, T : Clone> CloneIfNeeded<T> for &'a T { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
184 | #[inline] |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
185 | /// Clone |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
186 | fn clone_if_needed(self) -> T { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
187 | self.clone() |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
188 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
189 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
190 | |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
191 | impl<'a, T : Clone> CloneIfNeeded<T> for &'a mut T { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
192 | #[inline] |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
193 | /// Clone |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
194 | fn clone_if_needed(self) -> T { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
195 | self.clone() |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
196 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
197 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
198 | |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
199 | impl<'a, T> CloneIfNeeded<T> for T { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
200 | #[inline] |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
201 | /// No clone needed |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
202 | fn clone_if_needed(self) -> T { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
203 | self |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
204 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
205 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
206 | |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
207 | /// Trait for objects that have an associated scalar field. |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
208 | pub trait HasScalarField { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
209 | type Field : Num; |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
210 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
211 | |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
212 | /// Trait for objects that have an associated real field. |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
213 | pub trait HasRealField : HasScalarField<Field = Self::RealField> { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
214 | type RealField : Float; |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
215 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
216 | |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
217 | impl<T> HasRealField for T where T : HasScalarField, T::Field : Float { |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
218 | type RealField = T::Field; |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
219 | } |
|
d2acaaddd9af
Try to have Field as member type in Mappings etc.
Tuomo Valkonen <tuomov@iki.fi>
parents:
32
diff
changeset
|
220 |