Skip to main content

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;
6use num_traits::ToPrimitive;
7
8/// A trait for types that can be created from primitive values, including f16.
9///
10/// This extends the `FromPrimitive` trait to also support conversion from f16 values.
11pub trait FromPrimitiveOrF16: FromPrimitive {
12    /// Converts an f16 value to this type, returning None if the conversion fails.
13    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}