polars_core/series/
amortized_iter.rs1#![allow(unsafe_op_in_unsafe_fn)]
2use std::ptr::NonNull;
3use std::rc::Rc;
4
5use crate::prelude::*;
6
7#[derive(Clone)]
9pub struct AmortSeries {
10 container: Rc<Series>,
11 inner: NonNull<ArrayRef>,
13}
14
15impl AsRef<Series> for AmortSeries {
17 fn as_ref(&self) -> &Series {
18 self.container.as_ref()
19 }
20}
21
22pub type ArrayBox = Box<dyn Array>;
23
24impl AmortSeries {
25 pub fn new(series: Rc<Series>) -> Self {
26 debug_assert_eq!(series.chunks().len(), 1);
27 let inner_chunk = series.array_ref(0) as *const ArrayRef as *mut arrow::array::ArrayRef;
28 let container = series;
29 AmortSeries {
30 container,
31 inner: NonNull::new(inner_chunk).unwrap(),
32 }
33 }
34
35 #[inline]
40 pub(crate) unsafe fn new_with_chunk(series: Rc<Series>, inner_chunk: &ArrayRef) -> Self {
41 AmortSeries {
42 container: series,
43 inner: NonNull::new(inner_chunk as *const ArrayRef as *mut ArrayRef).unwrap_unchecked(),
44 }
45 }
46
47 pub fn deep_clone(&self) -> Series {
48 unsafe {
49 let s = &(*self.container);
50 debug_assert_eq!(s.chunks().len(), 1);
51 let array_ref = s.chunks().get_unchecked(0).clone();
52 let name = s.name().clone();
53 Series::from_chunks_and_dtype_unchecked(name.clone(), vec![array_ref], s.dtype())
54 }
55 }
56
57 #[inline]
58 pub unsafe fn swap(&mut self, array: &mut ArrayRef) {
63 std::mem::swap(self.inner.as_mut(), array);
64
65 unsafe {
67 let ptr = Rc::as_ptr(&self.container) as *mut Series;
68 (*ptr)._get_inner_mut().compute_len()
69 }
70 }
71
72 #[inline]
78 pub unsafe fn with_array<F, T>(&mut self, array: &mut ArrayRef, f: F) -> T
79 where
80 F: Fn(&AmortSeries) -> T,
81 {
82 unsafe {
83 self.swap(array);
84 let out = f(self);
85 self.swap(array);
86 out
87 }
88 }
89}
90
91pub(crate) unsafe fn unstable_series_container_and_ptr(
94 name: PlSmallStr,
95 inner_values: ArrayRef,
96 iter_dtype: &DataType,
97) -> (Series, *mut ArrayRef) {
98 let series_container = {
99 let mut s = Series::from_chunks_and_dtype_unchecked(name, vec![inner_values], iter_dtype);
100 s.clear_flags();
101 s
102 };
103
104 let ptr = series_container.array_ref(0) as *const ArrayRef as *mut ArrayRef;
105 (series_container, ptr)
106}