#![allow(non_camel_case_types)]
use std::ffi::{c_char, c_int, c_void};
pub const LIB_DIR: &str = env!("ARROWMETAL_SYS_LIB_DIR");
#[repr(C)]
#[derive(Debug)]
pub struct ArrowSchema {
pub format: *const c_char,
pub name: *const c_char,
pub metadata: *const c_char,
pub flags: i64,
pub n_children: i64,
pub children: *mut *mut ArrowSchema,
pub dictionary: *mut ArrowSchema,
pub release: Option<unsafe extern "C" fn(*mut ArrowSchema)>,
pub private_data: *mut c_void,
}
#[repr(C)]
#[derive(Debug)]
pub struct ArrowArray {
pub length: i64,
pub null_count: i64,
pub offset: i64,
pub n_buffers: i64,
pub n_children: i64,
pub buffers: *mut *const c_void,
pub children: *mut *mut ArrowArray,
pub dictionary: *mut ArrowArray,
pub release: Option<unsafe extern "C" fn(*mut ArrowArray)>,
pub private_data: *mut c_void,
}
impl ArrowSchema {
pub const fn empty() -> Self {
Self {
format: std::ptr::null(),
name: std::ptr::null(),
metadata: std::ptr::null(),
flags: 0,
n_children: 0,
children: std::ptr::null_mut(),
dictionary: std::ptr::null_mut(),
release: None,
private_data: std::ptr::null_mut(),
}
}
}
impl ArrowArray {
pub const fn empty() -> Self {
Self {
length: 0,
null_count: 0,
offset: 0,
n_buffers: 0,
n_children: 0,
buffers: std::ptr::null_mut(),
children: std::ptr::null_mut(),
dictionary: std::ptr::null_mut(),
release: None,
private_data: std::ptr::null_mut(),
}
}
}
#[repr(C)]
pub struct am_array {
_private: [u8; 0],
}
#[repr(C)]
pub struct am_groupby {
_private: [u8; 0],
}
#[repr(C)]
pub struct am_plan_source {
_private: [u8; 0],
}
#[repr(C)]
pub struct am_plan_result {
_private: [u8; 0],
}
pub mod ffi {
use super::*;
unsafe extern "C" {
pub fn am_version() -> *const c_char;
pub fn am_device_name() -> *const c_char;
pub fn am_last_error() -> *const c_char;
pub fn am_import(
schema: *const ArrowSchema,
array: *mut ArrowArray,
out: *mut *mut am_array,
) -> c_int;
pub fn am_export(
a: *mut am_array,
schema: *mut ArrowSchema,
array: *mut ArrowArray,
) -> c_int;
pub fn am_release(a: *mut am_array);
pub fn am_length(a: *mut am_array) -> i64;
pub fn am_null_count(a: *mut am_array) -> i64;
pub fn am_format(a: *mut am_array) -> *const c_char;
pub fn am_reduce(
a: *mut am_array,
op: c_int,
out_i64: *mut i64,
out_f64: *mut f64,
out_kind: *mut c_int,
is_null: *mut c_int,
) -> c_int;
pub fn am_compare_scalar(
a: *mut am_array,
op: c_int,
scalar: *const c_void,
out: *mut *mut am_array,
) -> c_int;
pub fn am_compare_array(
a: *mut am_array,
op: c_int,
b: *mut am_array,
out: *mut *mut am_array,
) -> c_int;
pub fn am_cast(a: *mut am_array, format: *const c_char, out: *mut *mut am_array) -> c_int;
pub fn am_filter(a: *mut am_array, mask: *mut am_array, out: *mut *mut am_array) -> c_int;
pub fn am_take(a: *mut am_array, indices: *mut am_array, out: *mut *mut am_array) -> c_int;
pub fn am_slice(
a: *mut am_array,
offset: i64,
length: i64,
out: *mut *mut am_array,
) -> c_int;
pub fn am_argsort(a: *mut am_array, descending: c_int, out: *mut *mut am_array) -> c_int;
pub fn am_sort(a: *mut am_array, descending: c_int, out: *mut *mut am_array) -> c_int;
pub fn am_group_by_keys(
columns: *mut *mut am_array,
count: i64,
out: *mut *mut am_groupby,
) -> c_int;
pub fn am_group_by_group_count(gb: *mut am_groupby) -> i64;
pub fn am_group_by_keys_result(
gb: *mut am_groupby,
i: i64,
out: *mut *mut am_array,
) -> c_int;
pub fn am_group_by_ids(gb: *mut am_groupby, out: *mut *mut am_array) -> c_int;
pub fn am_group_by_release(gb: *mut am_groupby);
pub fn am_group_agg_ex(
gb: *mut am_groupby,
values: *mut am_array,
op: c_int,
p1: f64,
out: *mut *mut am_array,
) -> c_int;
pub fn am_plan_source_create(
name: *const c_char,
columns: *mut *mut am_array,
names: *mut *const c_char,
n_columns: i64,
out: *mut *mut am_plan_source,
) -> c_int;
pub fn am_plan_source_release(s: *mut am_plan_source);
pub fn am_plan_run(
plan_json: *const c_char,
sources: *mut *mut am_plan_source,
n_sources: i64,
optimize: c_int,
out: *mut *mut am_plan_result,
) -> c_int;
pub fn am_plan_explain(
plan_json: *const c_char,
sources: *mut *mut am_plan_source,
n_sources: i64,
optimize: c_int,
) -> *const c_char;
pub fn am_plan_column_count(r: *mut am_plan_result) -> i64;
pub fn am_plan_row_count(r: *mut am_plan_result) -> i64;
pub fn am_plan_column_name(r: *mut am_plan_result, i: i64) -> *const c_char;
pub fn am_plan_column(r: *mut am_plan_result, i: i64, out: *mut *mut am_array) -> c_int;
pub fn am_plan_result_release(r: *mut am_plan_result);
pub fn am_batch_begin() -> c_int;
pub fn am_batch_end() -> c_int;
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn c_data_interface_layout() {
assert_eq!(std::mem::size_of::<ArrowSchema>(), 9 * 8);
assert_eq!(std::mem::size_of::<ArrowArray>(), 10 * 8);
assert_eq!(std::mem::align_of::<ArrowSchema>(), 8);
assert_eq!(std::mem::align_of::<ArrowArray>(), 8);
}
#[test]
fn links_and_loads() {
let v = unsafe { std::ffi::CStr::from_ptr(ffi::am_version()) };
assert!(!v.to_bytes().is_empty(), "am_version() returned an empty string");
}
}