vortex_dtype/
f16.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use half::f16;
5use num_traits::{FromPrimitive, ToPrimitive};
6
7/// A trait for types that can be created from primitive values, including f16.
8///
9/// This extends the `FromPrimitive` trait to also support conversion from f16 values.
10pub trait FromPrimitiveOrF16: FromPrimitive {
11    /// Converts an f16 value to this type, returning None if the conversion fails.
12    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}