use std::borrow::Borrow;
use std::hash::Hash;
pub trait Set<T> {
fn contains<Q: ?Sized>(&self, value: &Q) -> bool
where
T: Borrow<Q>,
Q: Hash + Eq + Ord;
fn insert(&mut self, value: T) -> bool;
}
impl<T, S> Set<T> for std::collections::HashSet<T, S>
where
T: Hash + Eq,
S: std::hash::BuildHasher,
{
#[inline]
fn contains<Q: ?Sized>(&self, value: &Q) -> bool
where
T: Borrow<Q>,
Q: Hash + Eq + Ord,
{
std::collections::HashSet::contains(self, value)
}
#[inline]
fn insert(&mut self, value: T) -> bool {
std::collections::HashSet::insert(self, value)
}
}
impl<T> Set<T> for std::collections::BTreeSet<T>
where
T: Ord,
{
#[inline]
fn contains<Q: ?Sized>(&self, value: &Q) -> bool
where
T: Borrow<Q>,
Q: Hash + Eq + Ord,
{
std::collections::BTreeSet::contains(self, value)
}
#[inline]
fn insert(&mut self, value: T) -> bool {
std::collections::BTreeSet::insert(self, value)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn assert_set_contains<T>(set: &impl Set<T>, value: T)
where
T: Hash + Eq + Ord,
{
assert!(set.contains(&value));
}
fn assert_set_insert<T>(set: &mut impl Set<T>, value: T)
where
T: Hash + Eq + Ord,
{
assert!(set.insert(value));
}
#[test]
fn test_hash_set() {
let mut set = std::collections::HashSet::new();
assert_set_insert(&mut set, 1);
assert_set_contains(&set, 1);
}
#[test]
fn test_btree_set() {
let mut set = std::collections::BTreeSet::new();
assert_set_insert(&mut set, 1);
assert_set_contains(&set, 1);
}
}