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}