55 + std::fmt::Debug + std::fmt::Display + serde::Serialize |
55 + std::fmt::Debug + std::fmt::Display + serde::Serialize |
56 + CastFrom<u8> + CastFrom<u16> + CastFrom<u32> + CastFrom<u64> |
56 + CastFrom<u8> + CastFrom<u16> + CastFrom<u32> + CastFrom<u64> |
57 + CastFrom<u128> + CastFrom<usize> |
57 + CastFrom<u128> + CastFrom<usize> |
58 + CastFrom<i8> + CastFrom<i16> + CastFrom<i32> + CastFrom<i64> |
58 + CastFrom<i8> + CastFrom<i16> + CastFrom<i32> + CastFrom<i64> |
59 + CastFrom<i128> + CastFrom<isize> |
59 + CastFrom<i128> + CastFrom<isize> |
60 + CastFrom<f32> + CastFrom<f64> { |
60 + CastFrom<f32> + CastFrom<f64> |
|
61 + HasScalarField<Field = Self> { |
61 |
62 |
62 const ZERO : Self; |
63 const ZERO : Self; |
63 const ONE : Self; |
64 const ONE : Self; |
64 const TWO : Self; |
65 const TWO : Self; |
65 /// Generic version of `Self::MAX` |
66 /// Generic version of `Self::MAX` |
104 const ONE : Self = 1 as $type; |
105 const ONE : Self = 1 as $type; |
105 const TWO : Self = 2 as $type; |
106 const TWO : Self = 2 as $type; |
106 const RANGE_MAX : Self = <$type>::MAX; |
107 const RANGE_MAX : Self = <$type>::MAX; |
107 const RANGE_MIN : Self = <$type>::MIN; |
108 const RANGE_MIN : Self = <$type>::MIN; |
108 } |
109 } |
|
110 impl HasScalarField for $type { |
|
111 type Field = $type; |
|
112 } |
109 )* } |
113 )* } |
110 } |
114 } |
111 |
115 |
112 macro_rules! impl_integers { |
116 macro_rules! impl_integers { |
113 ($signed:ty : $($type:ty)*) => { $( |
117 ($signed:ty : $($type:ty)*) => { $( |
161 pub trait CompatibleUnsigned<F : Float> = Unsigned + Into<F>; |
165 pub trait CompatibleUnsigned<F : Float> = Unsigned + Into<F>; |
162 pub trait CompatibleSigned<F : Float> = Signed + Into<F>; |
166 pub trait CompatibleSigned<F : Float> = Signed + Into<F>; |
163 } |
167 } |
164 */ |
168 */ |
165 |
169 |
|
170 |
|
171 /// Trait for on-demand cloning as of `Self` as `Target`. |
|
172 /// |
|
173 /// Blanket implementations clone references, but do nothing if `Self` equals `Target`. |
|
174 /// |
|
175 /// The idea is to allow other traits to be implemented generically, similar to now one |
|
176 /// can work with references and owned values through [`std::borrow::Borrow`], but, in |
|
177 /// contrast to the latter, this trait will provide an owned value instead of reference. |
|
178 pub trait CloneIfNeeded<Target> { |
|
179 /// Clone `self` if needed as `Target`. |
|
180 fn clone_if_needed(self) -> Target; |
|
181 } |
|
182 |
|
183 impl<'a, T : Clone> CloneIfNeeded<T> for &'a T { |
|
184 #[inline] |
|
185 /// Clone |
|
186 fn clone_if_needed(self) -> T { |
|
187 self.clone() |
|
188 } |
|
189 } |
|
190 |
|
191 impl<'a, T : Clone> CloneIfNeeded<T> for &'a mut T { |
|
192 #[inline] |
|
193 /// Clone |
|
194 fn clone_if_needed(self) -> T { |
|
195 self.clone() |
|
196 } |
|
197 } |
|
198 |
|
199 impl<'a, T> CloneIfNeeded<T> for T { |
|
200 #[inline] |
|
201 /// No clone needed |
|
202 fn clone_if_needed(self) -> T { |
|
203 self |
|
204 } |
|
205 } |
|
206 |
|
207 /// Trait for objects that have an associated scalar field. |
|
208 pub trait HasScalarField { |
|
209 type Field : Num; |
|
210 } |
|
211 |
|
212 /// Trait for objects that have an associated real field. |
|
213 pub trait HasRealField : HasScalarField<Field = Self::RealField> { |
|
214 type RealField : Float; |
|
215 } |
|
216 |
|
217 impl<T> HasRealField for T where T : HasScalarField, T::Field : Float { |
|
218 type RealField = T::Field; |
|
219 } |
|
220 |