Skip to content

Commit d517f07

Browse files
authored
Add support for arrow2::types::f16 (#104)
* Add support for arrow2::types::f16 * Add a few more exotic values for half round-trip * cargo fmt
1 parent 6450acb commit d517f07

File tree

4 files changed

+32
-0
lines changed

4 files changed

+32
-0
lines changed

arrow2_convert/src/deserialize.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ impl_arrow_deserialize_primitive!(i8);
114114
impl_arrow_deserialize_primitive!(i16);
115115
impl_arrow_deserialize_primitive!(i32);
116116
impl_arrow_deserialize_primitive!(i64);
117+
impl_arrow_deserialize_primitive!(arrow2::types::f16);
117118
impl_arrow_deserialize_primitive!(f32);
118119
impl_arrow_deserialize_primitive!(f64);
119120

arrow2_convert/src/field.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ impl_numeric_type_full!(i8, Int8);
110110
impl_numeric_type_full!(i16, Int16);
111111
impl_numeric_type_full!(i32, Int32);
112112
impl_numeric_type_full!(i64, Int64);
113+
impl_numeric_type_full!(arrow2::types::f16, Float16);
113114
impl_numeric_type_full!(f32, Float32);
114115
impl_numeric_type_full!(f64, Float64);
115116

arrow2_convert/src/serialize.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ impl_numeric_type!(i8);
8686
impl_numeric_type!(i16);
8787
impl_numeric_type!(i32);
8888
impl_numeric_type!(i64);
89+
impl_numeric_type!(arrow2::types::f16);
8990
impl_numeric_type!(f32);
9091
impl_numeric_type!(f64);
9192

arrow2_convert/tests/test_round_trip.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use arrow2_convert::{
99
ArrowDeserialize, ArrowField, ArrowSerialize,
1010
};
1111
use std::borrow::Borrow;
12+
use std::f32::INFINITY;
1213
use std::sync::Arc;
1314

1415
#[test]
@@ -194,6 +195,34 @@ fn test_primitive_type_vec() {
194195
test_float_type!(f32);
195196
test_float_type!(f64);
196197

198+
// `arrow2::types::f16` isn't a native type so we can't just use `as`
199+
{
200+
let original_array: Vec<arrow2::types::f16> =
201+
vec![1.0, 2.5, 47800.0, 0.000012, -0.0, 0.0, INFINITY]
202+
.iter()
203+
.map(|f| arrow2::types::f16::from_f32(*f))
204+
.collect();
205+
let b: Box<dyn Array> = original_array.try_into_arrow().unwrap();
206+
let round_trip: Vec<arrow2::types::f16> = b.try_into_collection().unwrap();
207+
assert_eq!(original_array, round_trip);
208+
209+
let original_array: Vec<Option<arrow2::types::f16>> = vec![Some(1.), None, Some(3.)]
210+
.iter()
211+
.map(|f| f.map(arrow2::types::f16::from_f32))
212+
.collect();
213+
let b: Box<dyn Array> = original_array.try_into_arrow().unwrap();
214+
let round_trip: Vec<Option<arrow2::types::f16>> = b.try_into_collection().unwrap();
215+
assert_eq!(original_array, round_trip);
216+
217+
let original_array: Vec<Option<arrow2::types::f16>> = vec![Some(1.), None, Some(3.)]
218+
.iter()
219+
.map(|f| f.map(arrow2::types::f16::from_f32))
220+
.collect();
221+
let b: Arc<dyn Array> = original_array.try_into_arrow().unwrap();
222+
let round_trip: Vec<Option<arrow2::types::f16>> = b.try_into_collection().unwrap();
223+
assert_eq!(original_array, round_trip);
224+
};
225+
197226
// i128
198227
// i128 is special since we need to require precision and scale so the TryIntoArrow trait
199228
// is not implemented for Vec<i128>.

0 commit comments

Comments
 (0)