use core::{borrow::Borrow, fmt, ops::ControlFlow};
use munge::munge;
use rancor::{Fallible, Source};
use crate::{
collections::btree_map::{ArchivedBTreeMap, BTreeMapResolver},
ser::{Allocator, Writer},
Place, Portable, Serialize,
};
#[cfg_attr(feature = "bytecheck", derive(bytecheck::CheckBytes))]
#[derive(Portable)]
#[rkyv(crate)]
#[repr(transparent)]
pub struct ArchivedBTreeSet<K, const E: usize = 5>(ArchivedBTreeMap<K, (), E>);
impl<K, const E: usize> ArchivedBTreeSet<K, E> {
pub fn contains_key<Q: Ord + ?Sized>(&self, key: &Q) -> bool
where
K: Borrow<Q> + Ord,
{
self.0.contains_key(key)
}
pub fn get<Q: Ord + ?Sized>(&self, value: &Q) -> Option<&K>
where
K: Borrow<Q> + Ord,
{
self.0.get_key_value(value).map(|(key, _)| key)
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn resolve_from_len(
len: usize,
resolver: BTreeSetResolver,
out: Place<Self>,
) {
munge!(let ArchivedBTreeSet(inner) = out);
ArchivedBTreeMap::<K, (), E>::resolve_from_len(len, resolver.0, inner);
}
pub fn serialize_from_ordered_iter<I, KU, S>(
iter: I,
serializer: &mut S,
) -> Result<BTreeSetResolver, S::Error>
where
I: ExactSizeIterator,
I::Item: Borrow<KU>,
KU: Serialize<S, Archived = K>,
S: Fallible + Allocator + Writer + ?Sized,
S::Error: Source,
{
ArchivedBTreeMap::<K, (), E>::serialize_from_ordered_iter::<
_,
_,
_,
_,
(),
_,
>(iter.map(|k| (k, &())), serializer)
.map(BTreeSetResolver)
}
pub fn visit<T>(
&self,
mut f: impl FnMut(&K) -> ControlFlow<T>,
) -> Option<T> {
self.0.visit(|k, _| f(k))
}
}
impl<K, const E: usize> fmt::Debug for ArchivedBTreeSet<K, E>
where
K: fmt::Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut set = f.debug_set();
self.visit(|k| {
set.entry(k);
ControlFlow::<()>::Continue(())
});
set.finish()
}
}
pub struct BTreeSetResolver(BTreeMapResolver);