polars_python/expr/
mod.rs

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
#[cfg(feature = "pymethods")]
mod array;
#[cfg(feature = "pymethods")]
mod binary;
#[cfg(feature = "pymethods")]
mod bitwise;
#[cfg(feature = "pymethods")]
mod categorical;
#[cfg(feature = "pymethods")]
mod datetime;
#[cfg(feature = "pymethods")]
mod general;
#[cfg(feature = "pymethods")]
mod list;
#[cfg(all(feature = "meta", feature = "pymethods"))]
mod meta;
#[cfg(feature = "pymethods")]
mod name;
#[cfg(feature = "pymethods")]
mod rolling;
#[cfg(feature = "pymethods")]
mod serde;
#[cfg(feature = "pymethods")]
mod string;
#[cfg(feature = "pymethods")]
mod r#struct;

use std::mem::ManuallyDrop;

use polars::lazy::dsl::Expr;
use pyo3::pyclass;

#[pyclass]
#[repr(transparent)]
#[derive(Clone)]
pub struct PyExpr {
    pub inner: Expr,
}

impl From<Expr> for PyExpr {
    fn from(expr: Expr) -> Self {
        PyExpr { inner: expr }
    }
}

pub(crate) trait ToExprs {
    fn to_exprs(self) -> Vec<Expr>;
}

impl ToExprs for Vec<PyExpr> {
    fn to_exprs(self) -> Vec<Expr> {
        // SAFETY: repr is transparent.
        unsafe {
            let length = self.len();
            let capacity = self.capacity();
            let mut manual_drop_vec = ManuallyDrop::new(self);
            let vec_ptr: *mut PyExpr = manual_drop_vec.as_mut_ptr();
            let ptr: *mut Expr = vec_ptr as *mut Expr;
            Vec::from_raw_parts(ptr, length, capacity)
        }
    }
}

pub(crate) trait ToPyExprs {
    fn to_pyexprs(self) -> Vec<PyExpr>;
}

impl ToPyExprs for Vec<Expr> {
    fn to_pyexprs(self) -> Vec<PyExpr> {
        // SAFETY: repr is transparent.
        unsafe {
            let length = self.len();
            let capacity = self.capacity();
            let mut manual_drop_vec = ManuallyDrop::new(self);
            let vec_ptr: *mut Expr = manual_drop_vec.as_mut_ptr();
            let ptr: *mut PyExpr = vec_ptr as *mut PyExpr;
            Vec::from_raw_parts(ptr, length, capacity)
        }
    }
}