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