1use half::f16;
5use num_traits::FromPrimitive;
6use num_traits::ToPrimitive;
7
8pub trait FromPrimitiveOrF16: FromPrimitive {
12 fn from_f16(v: f16) -> Option<Self>;
14}
15
16macro_rules! from_primitive_or_f16_for_signed {
17 ($T:ty) => {
18 impl FromPrimitiveOrF16 for $T {
19 fn from_f16(_: f16) -> Option<Self> {
20 None
21 }
22 }
23 };
24}
25
26macro_rules! from_primitive_or_f16_for_unsigned {
27 ($T:ty) => {
28 impl FromPrimitiveOrF16 for $T {
29 fn from_f16(value: f16) -> Option<Self> {
30 value.to_u64().and_then(|v| FromPrimitive::from_u64(v))
31 }
32 }
33 };
34}
35
36from_primitive_or_f16_for_unsigned!(usize);
37from_primitive_or_f16_for_unsigned!(u8);
38from_primitive_or_f16_for_unsigned!(u16);
39from_primitive_or_f16_for_unsigned!(u32);
40from_primitive_or_f16_for_unsigned!(u64);
41from_primitive_or_f16_for_signed!(i8);
42from_primitive_or_f16_for_signed!(i16);
43from_primitive_or_f16_for_signed!(i32);
44from_primitive_or_f16_for_signed!(i64);
45
46impl FromPrimitiveOrF16 for f16 {
47 fn from_f16(v: f16) -> Option<Self> {
48 Some(v)
49 }
50}
51
52impl FromPrimitiveOrF16 for f32 {
53 fn from_f16(v: f16) -> Option<Self> {
54 Some(v.to_f32())
55 }
56}
57
58impl FromPrimitiveOrF16 for f64 {
59 fn from_f16(v: f16) -> Option<Self> {
60 Some(v.to_f64())
61 }
62}