1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//! Bridge definitions for Arrow interop, DLPack, and contiguous_split.
//!
//! Provides:
//! - Arrow IPC serialization (legacy)
//! - Arrow C Data Interface (true zero-copy via raw pointers)
//! - DLPack tensor exchange
//! - contiguous_split / pack / unpack for efficient GPU buffer management
#[cxx::bridge(namespace = "cudf_shims")]
pub mod ffi {
unsafe extern "C++" {
include!("interop_shim.h");
include!("column_shim.h");
include!("table_shim.h");
type OwnedColumn = crate::column::ffi::OwnedColumn;
type OwnedTable = crate::table::ffi::OwnedTable;
// ── Arrow IPC (legacy) ────────────────────────────────────
/// Export a column to Arrow IPC format (serialized bytes).
fn column_to_arrow_ipc(col: &OwnedColumn) -> Result<Vec<u8>>;
/// Import a column from Arrow IPC format.
fn column_from_arrow_ipc(data: &[u8]) -> Result<UniquePtr<OwnedColumn>>;
/// Export a table to Arrow IPC format.
fn table_to_arrow_ipc(table: &OwnedTable) -> Result<Vec<u8>>;
/// Import a table from Arrow IPC format.
fn table_from_arrow_ipc(data: &[u8]) -> Result<UniquePtr<OwnedTable>>;
// ── Arrow C Data Interface ────────────────────────────────
/// Import a column from ArrowSchema + ArrowArray pointers.
fn column_from_arrow_cdata(
schema_ptr: u64,
array_ptr: u64,
) -> Result<UniquePtr<OwnedColumn>>;
/// Import a table from ArrowSchema + ArrowArray pointers.
fn table_from_arrow_cdata(schema_ptr: u64, array_ptr: u64)
-> Result<UniquePtr<OwnedTable>>;
/// Free an ArrowSchema without consuming it.
fn free_arrow_schema(ptr: u64);
/// Free an ArrowArray without consuming it.
fn free_arrow_array(ptr: u64);
// ── Arrow C Data Interface (paired export) ───────────────
/// Opaque pair holding schema + array from a single GPU→host transfer.
type ArrowExportPair;
/// Export column schema + array in one GPU→host copy.
fn column_to_arrow_pair(col: &OwnedColumn) -> Result<UniquePtr<ArrowExportPair>>;
/// Export table schema + array in one GPU→host copy.
fn table_to_arrow_pair(table: &OwnedTable) -> Result<UniquePtr<ArrowExportPair>>;
/// Take ownership of the schema pointer (sets internal to null).
fn arrow_pair_schema(pair: Pin<&mut ArrowExportPair>) -> u64;
/// Take ownership of the array pointer (sets internal to null).
fn arrow_pair_array(pair: Pin<&mut ArrowExportPair>) -> u64;
// ── DLPack ────────────────────────────────────────────────
/// Convert table to DLPack tensor (returns DLManagedTensor* as u64).
fn table_to_dlpack(table: &OwnedTable) -> Result<u64>;
/// Import table from DLPack tensor (consumes the tensor).
fn table_from_dlpack(dlpack_ptr: u64) -> Result<UniquePtr<OwnedTable>>;
/// Free a DLPack tensor without consuming it.
fn free_dlpack(dlpack_ptr: u64);
// ── contiguous_split / pack / unpack ──────────────────────
/// Opaque handle for packed columns (cudf::packed_columns wrapper).
type OwnedPackedColumns;
/// Pack a table into a single contiguous GPU buffer + host metadata.
fn pack_table(table: &OwnedTable) -> Result<UniquePtr<OwnedPackedColumns>>;
/// Get host-side metadata bytes from packed columns.
fn packed_metadata(packed: &OwnedPackedColumns) -> Result<Vec<u8>>;
/// Get GPU data buffer size in bytes.
fn packed_gpu_data_size(packed: &OwnedPackedColumns) -> Result<i64>;
/// Unpack packed columns back into a table (deep copy).
fn unpack_table(packed: &OwnedPackedColumns) -> Result<UniquePtr<OwnedTable>>;
/// Perform contiguous_split. Returns [handle, num_parts].
fn contiguous_split_table(table: &OwnedTable, splits: &[i32]) -> Result<Vec<u64>>;
/// Get one packed partition from a contiguous_split result.
fn contiguous_split_get(handle: u64, index: i32) -> Result<UniquePtr<OwnedPackedColumns>>;
/// Free a contiguous_split result handle.
fn contiguous_split_free(handle: u64);
}
}