#[macro_export]
macro_rules! pyset {
($structname:ident (module = $module:literal, item = $item:ty as $itemview:ty $(, derive = ($( $derivetrait:ident ),*) )? )) => {
pub mod $structname {
use kgdata_core::pyo3helper::unsafe_update_view_lifetime_signature;
use pyo3::prelude::*;
#[pyclass(module = $module, name = "SetView")]
pub struct SetView(pub &'static hashbrown::HashSet<$item>);
#[pyclass]
pub struct IterView(pub hashbrown::hash_set::Iter<'static, $item>);
impl SetView {
pub fn new(lst: &hashbrown::HashSet<$item>) -> Self {
Self(unsafe_update_view_lifetime_signature(lst))
}
}
#[pymethods]
impl SetView {
fn __iter__(&self) -> IterView {
IterView(self.0.iter())
}
fn __len__(&self) -> usize {
self.0.len()
}
fn __contains__(&self, item: $itemview) -> bool {
self.0.contains(item.0)
}
}
#[pymethods]
impl IterView {
pub fn __iter__(slf: PyRef<'_, Self>) -> PyRef<'_, Self> {
slf
}
pub fn __next__(&mut self) -> Option<$itemview> {
if let Some(v) = self.0.next() {
Some(<$itemview>::new(v))
} else {
None
}
}
}
}
};
}