Skip to main content

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