nalgebra/src/base/scalar.rs

37 lines
1.3 KiB
Rust
Raw Normal View History

use std::any::TypeId;
use std::fmt::Debug;
2021-07-14 17:25:16 +08:00
/// The basic scalar trait for all structures of `nalgebra`.
///
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 {
#[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
fn is<T: Scalar>() -> bool {
TypeId::of::<Self>() == TypeId::of::<T>()
}
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;
}
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 {
#[inline(always)]
fn inlined_clone(&self) -> T {
*self
}
}