use std::any::TypeId; use std::fmt::Debug; /// The basic scalar trait for all structures of `nalgebra`. /// /// 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 { #[inline] /// Tests if `Self` is the same as the type `T`. /// /// 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 fn is() -> bool { TypeId::of::() == TypeId::of::() } /// Performance hack: Clone doesn't get inlined for Copy types in debug /// mode, so make it inline anyway. fn inlined_clone(&self) -> Self; } // Unfortunately, this blanket impl leads to many misleading compiler messages // telling you to implement Copy, even though Scalar is what's really needed. impl Scalar for T { #[inline(always)] fn inlined_clone(&self) -> T { *self } }