polars_arrow/io/ipc/write/serialize/
list.rs

1use 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}