use smallvec::SmallVec;
pub struct DynamicSubscriptions<U> {
next_id: usize,
items: SmallVec<[(usize, U); 2]>,
}
impl<U> Default for DynamicSubscriptions<U> {
fn default() -> Self { Self { next_id: 0, items: SmallVec::new() } }
}
impl<U> DynamicSubscriptions<U> {
#[inline]
pub fn new() -> Self { Self::default() }
#[inline]
pub fn add(&mut self, item: U) -> usize {
let id = self.next_id;
self.next_id += 1;
self.items.push((id, item));
id
}
#[inline]
pub fn reserve_id(&mut self) -> usize {
let id = self.next_id;
self.next_id += 1;
id
}
#[inline]
pub fn insert(&mut self, id: usize, item: U) { self.items.push((id, item)); }
pub fn remove(&mut self, id: usize) -> Option<U> {
self
.items
.iter()
.position(|(i, _)| *i == id)
.map(|pos| self.items.remove(pos).1)
}
#[inline]
pub fn contains(&self, id: usize) -> bool { self.items.iter().any(|(i, _)| *i == id) }
#[inline]
pub fn len(&self) -> usize { self.items.len() }
#[inline]
pub fn is_empty(&self) -> bool { self.items.is_empty() }
#[inline]
pub fn drain(&mut self) -> impl Iterator<Item = U> + '_ {
self.items.drain(..).map(|(_, item)| item)
}
#[inline]
pub fn iter(&self) -> impl Iterator<Item = &U> { self.items.iter().map(|(_, item)| item) }
#[inline]
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut U> {
self.items.iter_mut().map(|(_, item)| item)
}
}
use super::Subscription;
impl<U: Subscription> DynamicSubscriptions<U> {
#[inline]
pub fn unsubscribe_all(&mut self) {
for item in self.drain() {
item.unsubscribe();
}
}
#[inline]
pub fn all_closed(&self) -> bool {
self
.items
.iter()
.all(|(_, item)| item.is_closed())
}
}