Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-arrow/src/ffi/bridge.rs
6939 views
1
use crate::array::*;
2
use crate::{match_integer_type, with_match_primitive_type_full};
3
4
macro_rules! ffi_dyn {
5
($array:expr, $ty:ty) => {{
6
let a = $array.as_any().downcast_ref::<$ty>().unwrap();
7
if a.offset().is_some() {
8
$array
9
} else {
10
Box::new(a.to_ffi_aligned())
11
}
12
}};
13
}
14
15
pub fn align_to_c_data_interface(array: Box<dyn Array>) -> Box<dyn Array> {
16
use crate::datatypes::PhysicalType::*;
17
match array.dtype().to_physical_type() {
18
Null => ffi_dyn!(array, NullArray),
19
Boolean => ffi_dyn!(array, BooleanArray),
20
Primitive(primitive) => with_match_primitive_type_full!(primitive, |$T| {
21
ffi_dyn!(array, PrimitiveArray<$T>)
22
}),
23
Binary => ffi_dyn!(array, BinaryArray<i32>),
24
LargeBinary => ffi_dyn!(array, BinaryArray<i64>),
25
FixedSizeBinary => ffi_dyn!(array, FixedSizeBinaryArray),
26
Utf8 => ffi_dyn!(array, Utf8Array::<i32>),
27
LargeUtf8 => ffi_dyn!(array, Utf8Array::<i64>),
28
List => ffi_dyn!(array, ListArray::<i32>),
29
LargeList => ffi_dyn!(array, ListArray::<i64>),
30
FixedSizeList => ffi_dyn!(array, FixedSizeListArray),
31
Struct => ffi_dyn!(array, StructArray),
32
Union => ffi_dyn!(array, UnionArray),
33
Map => ffi_dyn!(array, MapArray),
34
Dictionary(key_type) => {
35
match_integer_type!(key_type, |$T| {
36
ffi_dyn!(array, DictionaryArray<$T>)
37
})
38
},
39
BinaryView => ffi_dyn!(array, BinaryViewArray),
40
Utf8View => ffi_dyn!(array, Utf8ViewArray),
41
}
42
}
43
44