1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
use alloc::collections::{btree_set::Iter, BTreeSet}; use core::ops::Deref; use crate::util::owner::Owner; pub struct SharedSet<T: Ord + Clone>(BTreeSet<T>); impl<T: Ord + Clone> SharedSet<T> { #[inline] pub fn new() -> Self { Self(BTreeSet::new()) } #[inline] pub fn iter(&self) -> Iter<T> { self.0.iter() } #[inline] pub fn len(&self) -> usize { self.0.len() } } pub fn insert<T: Ord + Clone, O: Owner<SharedSet<T>>>( owner: O, value: T, ) -> Option<SharedSetHandle<T, O>> { if owner.with(|set| set.0.insert(value.clone()))? { Some(SharedSetHandle { owner, value }) } else { None } } pub struct SharedSetHandle<T: Ord + Clone, O: Owner<SharedSet<T>>> { owner: O, value: T, } impl<T: Ord + Clone, O: Owner<SharedSet<T>>> SharedSetHandle<T, O> { #[inline] pub fn owner(&self) -> &O { &self.owner } } impl<T: Ord + Clone, O: Owner<SharedSet<T>>> Deref for SharedSetHandle<T, O> { type Target = T; fn deref(&self) -> &Self::Target { &self.value } } impl<T: Ord + Clone, O: Owner<SharedSet<T>>> Drop for SharedSetHandle<T, O> { #[inline] fn drop(&mut self) { self.owner.with(|set| set.0.remove(&self.value)); } }