polars_arrow/io/ipc/write/serialize/
list.rs1use super::*;
2
3pub(super) fn write_list<O: Offset>(
4 array: &ListArray<O>,
5 buffers: &mut Vec<ipc::Buffer>,
6 arrow_data: &mut Vec<u8>,
7 nodes: &mut Vec<ipc::FieldNode>,
8 offset: &mut i64,
9 is_little_endian: bool,
10 compression: Option<Compression>,
11) {
12 let offsets = array.offsets().buffer();
13 let validity = array.validity();
14
15 write_bitmap(
16 validity,
17 offsets.len() - 1,
18 buffers,
19 arrow_data,
20 offset,
21 compression,
22 );
23
24 let first = *offsets.first().unwrap();
25 let last = *offsets.last().unwrap();
26 if first == O::zero() {
27 write_buffer(
28 offsets,
29 buffers,
30 arrow_data,
31 offset,
32 is_little_endian,
33 compression,
34 );
35 } else {
36 write_buffer_from_iter(
37 offsets.iter().map(|x| *x - first),
38 buffers,
39 arrow_data,
40 offset,
41 is_little_endian,
42 compression,
43 );
44 }
45
46 write(
47 array
48 .values()
49 .sliced(first.to_usize(), last.to_usize() - first.to_usize())
50 .as_ref(),
51 buffers,
52 arrow_data,
53 nodes,
54 offset,
55 is_little_endian,
56 compression,
57 );
58}