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-07-14 17:25:16 +08:00
|
|
|
/// The basic scalar trait for all structures of `nalgebra`.
|
2016-12-05 05:44:42 +08:00
|
|
|
///
|
2021-07-14 17:25:16 +08:00
|
|
|
/// This is by design a very loose trait, and does not make any assumption on
|
|
|
|
/// the algebraic properties of `Self`. It has various purposes and objectives:
|
|
|
|
/// - Enforces simple and future-proof trait bounds.
|
|
|
|
/// - Enables important optimizations for floating point types via specialization.
|
|
|
|
/// - Makes debugging generic code possible in most circumstances.
|
|
|
|
pub trait Scalar: 'static + Clone + Debug {
|
2017-08-03 01:37:44 +08:00
|
|
|
#[inline]
|
2021-07-14 17:25:16 +08:00
|
|
|
/// Tests if `Self` is the same as the type `T`.
|
2017-08-14 01:52:57 +08:00
|
|
|
///
|
2021-07-14 17:25:16 +08:00
|
|
|
/// Typically used to test of `Self` is an `f32` or an `f64`, which is
|
|
|
|
/// important as it allows for specialization and certain optimizations to
|
|
|
|
/// be made.
|
|
|
|
///
|
|
|
|
/// If the need ever arose to get rid of the `'static` requirement
|
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-07-14 17:25:16 +08:00
|
|
|
/// Performance hack: Clone doesn't get inlined for Copy types in debug
|
|
|
|
/// mode, so make it inline anyway.
|
|
|
|
fn inlined_clone(&self) -> Self;
|
2019-12-06 06:54:17 +08:00
|
|
|
}
|
|
|
|
|
2021-07-17 12:17:56 +08:00
|
|
|
// Unfortunately, this blanket impl leads to many misleading compiler messages
|
|
|
|
// telling you to implement Copy, even though Scalar is what's really needed.
|
2021-07-14 17:25:16 +08:00
|
|
|
impl<T: 'static + Copy + Debug> 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
|
|
|
}
|