Remove the Scalar::is method, which is unsound.

This commit is contained in:
Sébastien Crozet 2021-08-03 17:53:48 +02:00
parent 38ac9a2f9a
commit 6d57396a42
2 changed files with 4 additions and 12 deletions

View File

@ -22,6 +22,7 @@ use crate::base::dimension::{Dim, Dynamic, U1};
use crate::base::storage::{RawStorage, RawStorageMut}; use crate::base::storage::{RawStorage, RawStorageMut};
use crate::base::uninit::{InitStatus, Initialized}; use crate::base::uninit::{InitStatus, Initialized};
use crate::base::{Matrix, Scalar, Vector}; use crate::base::{Matrix, Scalar, Vector};
use std::any::TypeId;
// # Safety // # Safety
// The content of `y` must only contain values for which // The content of `y` must only contain values for which
@ -265,7 +266,7 @@ pub unsafe fn gemm_uninit<
return; return;
} }
if T::is::<f32>() { if TypeId::of::<T>() == TypeId::of::<f32>() {
let (rsa, csa) = a.strides(); let (rsa, csa) = a.strides();
let (rsb, csb) = b.strides(); let (rsb, csb) = b.strides();
let (rsc, csc) = y.strides(); let (rsc, csc) = y.strides();
@ -287,7 +288,7 @@ pub unsafe fn gemm_uninit<
csc as isize, csc as isize,
); );
return; return;
} else if T::is::<f64>() { } else if TypeId::of::<T>() == TypeId::of::<f64>() {
let (rsa, csa) = a.strides(); let (rsa, csa) = a.strides();
let (rsb, csb) = b.strides(); let (rsb, csb) = b.strides();
let (rsc, csc) = y.strides(); let (rsc, csc) = y.strides();

View File

@ -1,19 +1,10 @@
use std::any::Any; use std::any::Any;
use std::any::TypeId;
use std::fmt::Debug; use std::fmt::Debug;
/// The basic scalar type for all structures of `nalgebra`. /// The basic scalar type for all structures of `nalgebra`.
/// ///
/// This does not make any assumption on the algebraic properties of `Self`. /// This does not make any assumption on the algebraic properties of `Self`.
pub trait Scalar: Clone + PartialEq + Debug + Any { pub trait Scalar: 'static + Clone + PartialEq + Debug {
#[inline]
/// Tests if `Self` the same as the type `T`
///
/// Typically used to test of `Self` is a f32 or a f64 with `T::is::<f32>()`.
fn is<T: Scalar>() -> bool {
TypeId::of::<Self>() == TypeId::of::<T>()
}
#[inline(always)] #[inline(always)]
/// Performance hack: Clone doesn't get inlined for Copy types in debug mode, so make it inline anyway. /// Performance hack: Clone doesn't get inlined for Copy types in debug mode, so make it inline anyway.
fn inlined_clone(&self) -> Self { fn inlined_clone(&self) -> Self {