use core::{
borrow::Borrow,
fmt,
hash::{Hash, Hasher},
};
use munge::munge;
use rancor::{Fallible, Source};
use crate::{
collections::swiss_table::map::{ArchivedHashMap, HashMapResolver, Keys},
hash::FxHasher64,
ser::{Allocator, Writer},
Place, Portable, Serialize,
};
#[derive(Portable)]
#[rkyv(crate)]
#[cfg_attr(feature = "bytecheck", derive(bytecheck::CheckBytes))]
#[repr(transparent)]
pub struct ArchivedHashSet<K, H = FxHasher64> {
inner: ArchivedHashMap<K, (), H>,
}
impl<K, H> ArchivedHashSet<K, H> {
pub const fn len(&self) -> usize {
self.inner.len()
}
pub const fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn iter(&self) -> Keys<'_, K, (), H> {
self.inner.keys()
}
}
impl<K, H: Hasher + Default> ArchivedHashSet<K, H> {
pub fn get<Q>(&self, k: &Q) -> Option<&K>
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
self.inner.get_key_value(k).map(|(k, _)| k)
}
pub fn contains<Q>(&self, k: &Q) -> bool
where
K: Borrow<Q>,
Q: Hash + Eq + ?Sized,
{
self.inner.contains_key(k)
}
pub fn resolve_from_len(
len: usize,
load_factor: (usize, usize),
resolver: HashSetResolver,
out: Place<Self>,
) {
munge!(let ArchivedHashSet { inner } = out);
ArchivedHashMap::resolve_from_len(len, load_factor, resolver.0, inner);
}
pub fn serialize_from_iter<I, KU, S>(
iter: I,
load_factor: (usize, usize),
serializer: &mut S,
) -> Result<HashSetResolver, S::Error>
where
I: Clone + ExactSizeIterator,
I::Item: Borrow<KU>,
KU: Serialize<S, Archived = K> + Hash + Eq,
S: Fallible + Writer + Allocator + ?Sized,
S::Error: Source,
{
Ok(HashSetResolver(
ArchivedHashMap::<K, (), H>::serialize_from_iter::<
_,
_,
(),
_,
_,
_,
>(iter.map(|x| (x, ())), load_factor, serializer)?,
))
}
}
impl<K: fmt::Debug, H> fmt::Debug for ArchivedHashSet<K, H> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_set().entries(self.iter()).finish()
}
}
impl<K: Hash + Eq, H: Hasher + Default> PartialEq for ArchivedHashSet<K, H> {
fn eq(&self, other: &Self) -> bool {
self.inner == other.inner
}
}
impl<K: Hash + Eq, H: Hasher + Default> Eq for ArchivedHashSet<K, H> {}
pub struct HashSetResolver(HashMapResolver);