zenu_matrix/
num.rs

1#![expect(clippy::cast_precision_loss, clippy::cast_possible_truncation)]
2
3use std::{
4    fmt::{Debug, Display},
5    ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign},
6};
7
8use num_traits::Float;
9
10use rand_distr::uniform::SampleUniform;
11use serde::Serialize;
12
13pub trait Num:
14    Default
15    + Clone
16    + Copy
17    + Debug
18    + Display
19    + Add<Self, Output = Self>
20    + PartialOrd
21    + Mul<Output = Self>
22    + Div<Output = Self>
23    + Sub<Output = Self>
24    + SubAssign
25    + DivAssign
26    + AddAssign
27    + MulAssign
28    + Float
29    + SampleUniform
30    + Serialize
31    + 'static
32{
33    fn is_f32() -> bool;
34    fn minus_one() -> Self;
35    fn from_usize(n: usize) -> Self;
36    #[must_use]
37    fn size() -> usize {
38        std::mem::size_of::<Self>()
39    }
40    fn from_f32(f: f32) -> Self;
41    fn from_f64(f: f64) -> Self;
42}
43
44impl Num for f32 {
45    fn is_f32() -> bool {
46        true
47    }
48
49    fn minus_one() -> f32 {
50        -1.0
51    }
52
53    fn from_usize(n: usize) -> f32 {
54        n as f32
55    }
56
57    fn from_f32(f: f32) -> Self {
58        f
59    }
60
61    fn from_f64(f: f64) -> Self {
62        f as f32
63    }
64}
65
66impl Num for f64 {
67    fn is_f32() -> bool {
68        false
69    }
70
71    fn minus_one() -> f64 {
72        -1.0
73    }
74
75    fn from_usize(n: usize) -> Self {
76        n as f64
77    }
78
79    fn from_f32(f: f32) -> Self {
80        f64::from(f)
81    }
82
83    fn from_f64(f: f64) -> Self {
84        f
85    }
86}