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;
22pub mod selector;
23#[cfg(feature = "pymethods")]
24mod serde;
25#[cfg(feature = "pymethods")]
26mod string;
27#[cfg(feature = "pymethods")]
28mod r#struct;
29
30use std::mem::ManuallyDrop;
31
32use polars::lazy::dsl::Expr;
33use pyo3::pyclass;
34
35#[pyclass]
36#[repr(transparent)]
37#[derive(Clone)]
38pub struct PyExpr {
39    pub inner: Expr,
40}
41
42impl From<Expr> for PyExpr {
43    fn from(expr: Expr) -> Self {
44        PyExpr { inner: expr }
45    }
46}
47
48pub(crate) trait ToExprs {
49    fn to_exprs(self) -> Vec<Expr>;
50}
51
52impl ToExprs for Vec<PyExpr> {
53    fn to_exprs(self) -> Vec<Expr> {
54        // SAFETY: repr is transparent.
55        unsafe {
56            let length = self.len();
57            let capacity = self.capacity();
58            let mut manual_drop_vec = ManuallyDrop::new(self);
59            let vec_ptr: *mut PyExpr = manual_drop_vec.as_mut_ptr();
60            let ptr: *mut Expr = vec_ptr as *mut Expr;
61            Vec::from_raw_parts(ptr, length, capacity)
62        }
63    }
64}
65
66pub(crate) trait ToPyExprs {
67    fn to_pyexprs(self) -> Vec<PyExpr>;
68}
69
70impl ToPyExprs for Vec<Expr> {
71    fn to_pyexprs(self) -> Vec<PyExpr> {
72        // SAFETY: repr is transparent.
73        unsafe {
74            let length = self.len();
75            let capacity = self.capacity();
76            let mut manual_drop_vec = ManuallyDrop::new(self);
77            let vec_ptr: *mut Expr = manual_drop_vec.as_mut_ptr();
78            let ptr: *mut PyExpr = vec_ptr as *mut PyExpr;
79            Vec::from_raw_parts(ptr, length, capacity)
80        }
81    }
82}