Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-parquet/src/arrow/read/deserialize/primitive/plain/required.rs
8507 views
1
use arrow::types::AlignedBytes;
2
3
use super::ArrayChunks;
4
use crate::parquet::error::ParquetResult;
5
6
#[inline(never)]
7
pub fn decode<B: AlignedBytes>(
8
values: ArrayChunks<'_, B>,
9
target: &mut Vec<B>,
10
) -> ParquetResult<()> {
11
if values.is_empty() {
12
return Ok(());
13
}
14
15
target.reserve(values.len());
16
17
// SAFETY: Vec guarantees if the `capacity != 0` the pointer to valid since we just reserve
18
// that pointer.
19
let dst = unsafe { target.as_mut_ptr().add(target.len()) };
20
let src = values.as_ptr();
21
22
// SAFETY:
23
// - `src` is valid for read of values.len() elements.
24
// - `dst` is valid for writes of values.len() elements, it was just reserved.
25
// - B::Unaligned is always aligned, since it has an alignment of 1
26
// - The ranges for src and dst do not overlap
27
unsafe {
28
std::ptr::copy_nonoverlapping::<B::Unaligned>(src.cast(), dst.cast(), values.len());
29
target.set_len(target.len() + values.len());
30
};
31
32
Ok(())
33
}
34
35