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