use crate::{key::Key, storage::Storage};
pub struct Set<K>
where
K: Key<K, ()>,
{
storage: K::Storage,
}
impl<K> Set<K>
where
K: Key<K, ()>,
{
#[inline]
pub fn new() -> Set<K> {
Set {
storage: K::Storage::default(),
}
}
pub fn iter(&self) -> Iter<K> {
Iter {
iter: self.storage.iter(),
}
}
#[inline]
pub fn contains(&self, key: K) -> bool {
self.storage.get(key).is_some()
}
#[inline]
pub fn insert(&mut self, value: K) -> bool {
self.storage.insert(value, ()).is_none()
}
#[inline]
pub fn remove(&mut self, key: K) -> bool {
self.storage.remove(key).is_some()
}
#[inline]
pub fn clear(&mut self) {
self.storage.clear()
}
pub fn is_empty(&self) -> bool {
self.storage.iter().next().is_none()
}
pub fn len(&self) -> usize {
self.storage.iter().count()
}
}
impl<K> Clone for Set<K>
where
K: Key<K, ()>,
K::Storage: Clone,
{
fn clone(&self) -> Set<K> {
Set {
storage: self.storage.clone(),
}
}
}
impl<K> Default for Set<K>
where
K: Key<K, ()>,
{
fn default() -> Self {
Self::new()
}
}
impl<K> std::fmt::Debug for Set<K>
where
K: Key<K, ()> + std::fmt::Debug,
{
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let mut debug_set = f.debug_set();
for k in self.iter() {
debug_set.entry(&k);
}
debug_set.finish()
}
}
impl<K> PartialEq for Set<K>
where
K: Key<K, ()>,
K::Storage: PartialEq,
{
fn eq(&self, other: &Self) -> bool {
self.storage == other.storage
}
}
impl<K> Eq for Set<K>
where
K: Key<K, ()>,
K::Storage: Eq,
{
}
pub struct Iter<K>
where
K: Key<K, ()>,
{
iter: <<K as Key<K, ()>>::Storage as Storage<K, ()>>::Iter,
}
impl<K> Iterator for Iter<K>
where
K: Key<K, ()>,
{
type Item = K;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().map(|(k, _)| k)
}
}
#[cfg(feature = "serde")]
impl<K> serde::Serialize for Set<K>
where
K: Key<K, ()> + serde::Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
use serde::ser::SerializeSeq as _;
let mut seq = serializer.serialize_seq(Some(self.len()))?;
for v in self.iter() {
seq.serialize_element(&v)?;
}
seq.end()
}
}
#[cfg(feature = "serde")]
impl<'de, K> serde::de::Deserialize<'de> for Set<K>
where
K: Key<K, ()> + serde::de::Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
return deserializer.deserialize_seq(SeqVisitor(std::marker::PhantomData));
struct SeqVisitor<K>(std::marker::PhantomData<K>);
impl<'de, K> serde::de::Visitor<'de> for SeqVisitor<K>
where
K: Key<K, ()> + serde::de::Deserialize<'de>,
{
type Value = Set<K>;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("a sequence")
}
#[inline]
fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
where
V: serde::de::SeqAccess<'de>,
{
let mut set = Set::new();
while let Some(elem) = visitor.next_element()? {
set.insert(elem);
}
Ok(set)
}
}
}
}