use core::borrow::Borrow as _;
use crate::raw;
use crate::raw::key;
use crate::sequential::Map;
#[repr(transparent)]
pub struct Set<K: key::Split> {
map: Map<K, raw::Set>,
}
impl<K> Default for Set<K>
where
K: key::Split,
{
fn default() -> Self {
Self::new()
}
}
impl<K> Set<K>
where
K: key::Split,
{
#[inline]
pub const fn new() -> Self {
Self { map: Map::new() }
}
pub fn contains(&self, key: &K::Borrowed) -> bool {
let (reader, byte) = K::split_last(key);
self.map
.get_raw(reader)
.map(|value| unsafe { value.cast::<raw::Set>().as_ref() })
.is_some_and(|set| set.contains(byte))
}
pub fn insert(&mut self, key: K::Insert<'_>) -> bool {
let (reader, byte) = K::split_last(key.borrow());
unsafe { self.map.entry_raw(reader) }
.or_default()
.insert_mut(byte)
}
}
#[cfg(test)]
mod tests {
use crate::sequential::Set;
#[test]
fn smoke_insert() {
let mut set = Set::<u64>::default();
assert!(set.insert(5));
assert!(set.insert(0xdeadbeef));
assert!(!set.insert(5));
}
#[test]
fn smoke_contains() {
let mut set = Set::<u64>::default();
assert!(set.insert(0xdeadbeef));
assert!(set.contains(&0xdeadbeef));
}
}