polars_python/expr/
mod.rs

1#[cfg(feature = "pymethods")]
2mod array;
3#[cfg(feature = "pymethods")]
4mod binary;
5#[cfg(feature = "pymethods")]
6mod bitwise;
7#[cfg(feature = "pymethods")]
8mod categorical;
9pub mod datatype;
10#[cfg(feature = "pymethods")]
11mod datetime;
12#[cfg(feature = "pymethods")]
13mod general;
14#[cfg(feature = "pymethods")]
15mod list;
16#[cfg(all(feature = "meta", feature = "pymethods"))]
17mod meta;
18#[cfg(feature = "pymethods")]
19mod name;
20#[cfg(feature = "pymethods")]
21mod rolling;
22#[cfg(feature = "pymethods")]
23mod serde;
24#[cfg(feature = "pymethods")]
25mod string;
26#[cfg(feature = "pymethods")]
27mod r#struct;
28
29use std::mem::ManuallyDrop;
30
31use polars::lazy::dsl::Expr;
32use pyo3::pyclass;
33
34#[pyclass]
35#[repr(transparent)]
36#[derive(Clone)]
37pub struct PyExpr {
38    pub inner: Expr,
39}
40
41impl From<Expr> for PyExpr {
42    fn from(expr: Expr) -> Self {
43        PyExpr { inner: expr }
44    }
45}
46
47pub(crate) trait ToExprs {
48    fn to_exprs(self) -> Vec<Expr>;
49}
50
51impl ToExprs for Vec<PyExpr> {
52    fn to_exprs(self) -> Vec<Expr> {
53        // SAFETY: repr is transparent.
54        unsafe {
55            let length = self.len();
56            let capacity = self.capacity();
57            let mut manual_drop_vec = ManuallyDrop::new(self);
58            let vec_ptr: *mut PyExpr = manual_drop_vec.as_mut_ptr();
59            let ptr: *mut Expr = vec_ptr as *mut Expr;
60            Vec::from_raw_parts(ptr, length, capacity)
61        }
62    }
63}
64
65pub(crate) trait ToPyExprs {
66    fn to_pyexprs(self) -> Vec<PyExpr>;
67}
68
69impl ToPyExprs for Vec<Expr> {
70    fn to_pyexprs(self) -> Vec<PyExpr> {
71        // SAFETY: repr is transparent.
72        unsafe {
73            let length = self.len();
74            let capacity = self.capacity();
75            let mut manual_drop_vec = ManuallyDrop::new(self);
76            let vec_ptr: *mut Expr = manual_drop_vec.as_mut_ptr();
77            let ptr: *mut PyExpr = vec_ptr as *mut PyExpr;
78            Vec::from_raw_parts(ptr, length, capacity)
79        }
80    }
81}