pub mod list;
pub mod map;
pub mod set;
pub use self::list::*;
pub use self::map::*;
pub use self::set::*;
#[macro_export]
macro_rules! pyview {
($viewname:ident (module = $module:literal, name = $name:literal, cls = $clsname:ident $(, derive = ($( $derivetrait:ident ),*) )? ) $({
$(
$(c($cel:ident: $cty:ty))? $(b($bel:ident: $bty:ty))? $(r($rel:ident: $rty:ty))? $(v($vel:ident: $vty:ty))? $(f($func:ident: $returntype:ty))? $(iter($itervec:ident { $iel:ident: $ity:ty }))? ),*
})?) => {
#[pyclass(module = $module, name = $name)]
$(#[derive($($derivetrait,)*)])?
pub struct $viewname(pub &'static $clsname);
impl $viewname {
pub fn new(value: &$clsname) -> Self {
Self(unsafe_update_view_lifetime_signature(value))
}
}
#[pymethods]
impl $viewname {
$($(
$(
#[getter]
fn $cel(&self) -> $cty {
self.0.$cel
}
)?
$(
#[getter]
fn $bel(&self) -> &$bty {
&self.0.$bel
}
)?
$(
#[getter]
fn $rel(&self) -> $rty {
self.0.$rel.as_ref()
}
)?
$(
#[getter]
fn $vel(&self) -> $vty {
<$vty>::new(&self.0.$vel)
}
)?
$(
fn $func(&self) -> $returntype {
self.0.$func()
}
)?
$(
fn $itervec(&self) -> $ity {
<$ity>::new(&self.0.$iel)
}
)?
)*)?
}
};
}
#[macro_export]
macro_rules! pywrap {
($wrapper:ident (module = $module:literal, name = $name:literal, cls = $clsname:ident $(, derive = ($( $derivetrait:ident ),*) )? ) $({
$(
$(c($cel:ident: $cty:ty))? $(b($bel:ident: $bty:ty))? $(r($rel:ident: $rty:ty))? $(v($vel:ident: $vty:ty))? $(f($func:ident: $returntype:ty))? $(iter($itervec:ident { $iel:ident: $ity:ty }))? ),*
})?) => {
#[pyclass(module = $module, name = $name)]
$(#[derive($($derivetrait,)*)])?
pub struct $wrapper(pub $clsname);
impl $wrapper {
pub fn new(value: $clsname) -> Self {
Self(value)
}
}
#[pymethods]
impl $wrapper {
$($(
$(
#[getter]
fn $cel(&self) -> $cty {
self.0.$cel
}
)?
$(
#[getter]
fn $bel(&self) -> &$bty {
&self.0.$bel
}
)?
$(
#[getter]
fn $rel(&self) -> $rty {
self.0.$rel.as_ref()
}
)?
$(
#[getter]
fn $vel(&self) -> $vty {
<$vty>::new(&self.0.$vel)
}
)?
$(
fn $func(&self) -> $returntype {
self.0.$func()
}
)?
$(
fn $itervec(&self) -> $ity {
<$ity>::new(&self.0.$iel)
}
)?
)*)?
}
};
}
#[macro_export]
macro_rules! pymirror {
($pycls:ident (module = $module:literal, name = $name:literal, cls = $rustcls:ident $(, derive = ($( $derivetrait:ident ),*) )? ) {
$(
$( c($cel:ident) )? $( b($bel:ident) )? $( r($oel:ident) )? ),*
}) => {
#[pyclass(module = $module, name = $name)]
$(#[derive($($derivetrait,)*)])?
pub struct $pycls {
$(
#[pyo3(get,set)]
$( $cel: PyObject, )?
$( $bel: PyObject, )?
$( $oel: PyObject, )?
)*
}
impl $pycls {
pub fn new(py: Python<'_>, value: &$rustcls) -> Self {
Self {
$(
$(
$cel: value.$cel.into_py(py),
)?
$(
$bel: (&value.$bel).into_py(py),
)?
$(
$oel: value.$oel.as_ref().into_py(py),
)?
)*
}
}
}
};
}
#[inline]
pub fn unsafe_update_view_lifetime_signature<T: ?Sized>(val: &T) -> &'static T {
return unsafe { std::mem::transmute(val) };
}
#[inline]
pub fn unsafe_update_mut_view_lifetime_signature<T: ?Sized>(val: &mut T) -> &'static mut T {
let ptr = val as *mut T;
unsafe { &mut *ptr }
}