2021-08-03 00:41:46 +08:00
|
|
|
use std::any::Any;
|
2017-08-03 01:37:44 +08:00
|
|
|
use std::any::TypeId;
|
2016-12-05 05:44:42 +08:00
|
|
|
use std::fmt::Debug;
|
|
|
|
|
2021-08-03 00:41:46 +08:00
|
|
|
/// The basic scalar type for all structures of `nalgebra`.
|
2016-12-05 05:44:42 +08:00
|
|
|
///
|
2021-08-03 00:41:46 +08:00
|
|
|
/// This does not make any assumption on the algebraic properties of `Self`.
|
|
|
|
pub trait Scalar: Clone + PartialEq + Debug + Any {
|
2017-08-03 01:37:44 +08:00
|
|
|
#[inline]
|
2021-08-03 00:41:46 +08:00
|
|
|
/// Tests if `Self` the same as the type `T`
|
2017-08-14 01:52:57 +08:00
|
|
|
///
|
2021-08-03 00:41:46 +08:00
|
|
|
/// Typically used to test of `Self` is a f32 or a f64 with `T::is::<f32>()`.
|
2017-08-03 01:37:44 +08:00
|
|
|
fn is<T: Scalar>() -> bool {
|
|
|
|
TypeId::of::<Self>() == TypeId::of::<T>()
|
|
|
|
}
|
2019-12-06 06:54:17 +08:00
|
|
|
|
2021-08-03 00:41:46 +08:00
|
|
|
#[inline(always)]
|
|
|
|
/// Performance hack: Clone doesn't get inlined for Copy types in debug mode, so make it inline anyway.
|
2021-07-18 09:19:20 +08:00
|
|
|
fn inlined_clone(&self) -> Self {
|
|
|
|
self.clone()
|
|
|
|
}
|
2019-12-06 06:54:17 +08:00
|
|
|
}
|
|
|
|
|
2021-08-03 00:41:46 +08:00
|
|
|
impl<T: Copy + PartialEq + Debug + Any> Scalar for T {
|
2019-12-06 06:54:17 +08:00
|
|
|
#[inline(always)]
|
|
|
|
fn inlined_clone(&self) -> T {
|
|
|
|
*self
|
|
|
|
}
|
2016-12-05 05:44:42 +08:00
|
|
|
}
|