use crate::generic::{map, node::Node, BTreeMap};
use cc_traits::{SimpleCollectionMut, SimpleCollectionRef, Slab, SlabMut};
use std::{
borrow::Borrow,
cmp::Ordering,
hash::{Hash, Hasher},
iter::{DoubleEndedIterator, ExactSizeIterator, FromIterator, FusedIterator, Peekable},
ops::RangeBounds,
};
pub struct BTreeSet<T, C> {
map: BTreeMap<T, (), C>,
}
impl<T, C> BTreeSet<T, C> {
#[inline]
pub fn new() -> Self
where
C: Default,
{
Self::default()
}
#[inline]
pub fn len(&self) -> usize {
self.map.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<T, C: Default> Default for BTreeSet<T, C> {
fn default() -> Self {
BTreeSet {
map: BTreeMap::default(),
}
}
}
impl<T, C: Slab<Node<T, ()>>> BTreeSet<T, C>
where
C: SimpleCollectionRef,
{
#[inline]
pub fn iter(&self) -> Iter<T, C> {
Iter {
inner: self.map.keys(),
}
}
}
impl<T: Ord, C: Slab<Node<T, ()>>> BTreeSet<T, C>
where
C: SimpleCollectionRef,
{
#[inline]
pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool
where
T: Borrow<Q>,
Q: Ord,
{
self.map.contains_key(value)
}
#[inline]
pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T>
where
T: Borrow<Q>,
Q: Ord,
{
match self.map.get_key_value(value) {
Some((t, ())) => Some(t),
None => None,
}
}
#[inline]
pub fn range<K: ?Sized, R>(&self, range: R) -> Range<T, C>
where
K: Ord,
T: Borrow<K>,
R: RangeBounds<K>,
{
Range {
inner: self.map.range(range),
}
}
#[inline]
pub fn union<'a, D: Slab<Node<T, ()>>>(
&'a self,
other: &'a BTreeSet<T, D>,
) -> Union<'a, T, C, D>
where
D: SimpleCollectionRef,
{
Union {
it1: self.iter().peekable(),
it2: other.iter().peekable(),
}
}
#[inline]
pub fn intersection<'a, D: Slab<Node<T, ()>>>(
&'a self,
other: &'a BTreeSet<T, D>,
) -> Intersection<'a, T, C, D>
where
D: SimpleCollectionRef,
{
Intersection {
it1: self.iter(),
it2: other.iter().peekable(),
}
}
#[inline]
pub fn difference<'a, D: Slab<Node<T, ()>>>(
&'a self,
other: &'a BTreeSet<T, D>,
) -> Difference<'a, T, C, D>
where
D: SimpleCollectionRef,
{
Difference {
it1: self.iter(),
it2: other.iter().peekable(),
}
}
#[inline]
pub fn symmetric_difference<'a, D: Slab<Node<T, ()>>>(
&'a self,
other: &'a BTreeSet<T, D>,
) -> SymmetricDifference<'a, T, C, D>
where
D: SimpleCollectionRef,
{
SymmetricDifference {
it1: self.iter().peekable(),
it2: other.iter().peekable(),
}
}
#[inline]
pub fn is_disjoint<D: Slab<Node<T, ()>>>(&self, other: &BTreeSet<T, D>) -> bool
where
D: SimpleCollectionRef,
{
self.intersection(other).next().is_none()
}
#[inline]
pub fn is_subset<D: Slab<Node<T, ()>>>(&self, other: &BTreeSet<T, D>) -> bool
where
D: SimpleCollectionRef,
{
self.difference(other).next().is_none()
}
#[inline]
pub fn is_superset<D: Slab<Node<T, ()>>>(&self, other: &BTreeSet<T, D>) -> bool
where
D: SimpleCollectionRef,
{
other.is_subset(self)
}
#[inline]
pub fn first(&self) -> Option<&T> {
self.map.first_key_value().map(|(k, _)| k)
}
#[inline]
pub fn last(&self) -> Option<&T> {
self.map.last_key_value().map(|(k, _)| k)
}
}
impl<T: Ord, C: SlabMut<Node<T, ()>>> BTreeSet<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
pub fn clear(&mut self)
where
C: cc_traits::Clear,
{
self.map.clear()
}
#[inline]
pub fn insert(&mut self, element: T) -> bool
where
T: Ord,
{
self.map.insert(element, ()).is_none()
}
#[inline]
pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool
where
T: Borrow<Q>,
Q: Ord,
{
self.map.remove(value).is_some()
}
#[inline]
pub fn take<Q: ?Sized>(&mut self, value: &Q) -> Option<T>
where
T: Borrow<Q>,
Q: Ord,
{
self.map.take(value).map(|(t, _)| t)
}
#[inline]
pub fn replace(&mut self, value: T) -> Option<T> {
self.map.replace(value, ()).map(|(t, ())| t)
}
#[inline]
pub fn pop_first(&mut self) -> Option<T> {
self.map.pop_first().map(|kv| kv.0)
}
#[inline]
pub fn pop_last(&mut self) -> Option<T> {
self.map.pop_last().map(|kv| kv.0)
}
#[inline]
pub fn retain<F>(&mut self, mut f: F)
where
F: FnMut(&T) -> bool,
{
self.drain_filter(|v| !f(v));
}
#[inline]
pub fn append(&mut self, other: &mut Self)
where
C: Default,
{
self.map.append(&mut other.map);
}
#[inline]
pub fn drain_filter<'a, F>(&'a mut self, pred: F) -> DrainFilter<'a, T, C, F>
where
F: 'a + FnMut(&T) -> bool,
{
DrainFilter::new(self, pred)
}
}
impl<T: Clone, C: Clone> Clone for BTreeSet<T, C> {
#[inline]
fn clone(&self) -> Self {
BTreeSet {
map: self.map.clone(),
}
}
#[inline]
fn clone_from(&mut self, other: &Self) {
self.map.clone_from(&other.map);
}
}
impl<T: Ord, C: SlabMut<Node<T, ()>> + Default> FromIterator<T> for BTreeSet<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn from_iter<I>(iter: I) -> Self
where
I: IntoIterator<Item = T>,
{
let mut set = BTreeSet::new();
set.extend(iter);
set
}
}
impl<T, C: SlabMut<Node<T, ()>>> IntoIterator for BTreeSet<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = T;
type IntoIter = IntoIter<T, C>;
#[inline]
fn into_iter(self) -> IntoIter<T, C> {
IntoIter {
inner: self.map.into_keys(),
}
}
}
impl<'a, T, C: SlabMut<Node<T, ()>>> IntoIterator for &'a BTreeSet<T, C>
where
C: SimpleCollectionRef,
{
type Item = &'a T;
type IntoIter = Iter<'a, T, C>;
#[inline]
fn into_iter(self) -> Iter<'a, T, C> {
self.iter()
}
}
impl<T: Ord, C: SlabMut<Node<T, ()>>> Extend<T> for BTreeSet<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = T>,
{
for t in iter {
self.insert(t);
}
}
}
impl<'a, T: 'a + Ord + Copy, C: SlabMut<Node<T, ()>>> Extend<&'a T> for BTreeSet<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = &'a T>,
{
self.extend(iter.into_iter().copied())
}
}
impl<T, L: PartialEq<T>, C: Slab<Node<T, ()>>, D: Slab<Node<L, ()>>> PartialEq<BTreeSet<L, D>>
for BTreeSet<T, C>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
#[inline]
fn eq(&self, other: &BTreeSet<L, D>) -> bool {
self.map.eq(&other.map)
}
}
impl<T: Eq, C: Slab<Node<T, ()>>> Eq for BTreeSet<T, C> where C: SimpleCollectionRef {}
impl<T, L: PartialOrd<T>, C: Slab<Node<T, ()>>, D: Slab<Node<L, ()>>> PartialOrd<BTreeSet<L, D>>
for BTreeSet<T, C>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
#[inline]
fn partial_cmp(&self, other: &BTreeSet<L, D>) -> Option<Ordering> {
self.map.partial_cmp(&other.map)
}
}
impl<T: Ord, C: Slab<Node<T, ()>>> Ord for BTreeSet<T, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn cmp(&self, other: &BTreeSet<T, C>) -> Ordering {
self.map.cmp(&other.map)
}
}
impl<T: Hash, C: Slab<Node<T, ()>>> Hash for BTreeSet<T, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn hash<H: Hasher>(&self, h: &mut H) {
self.map.hash(h)
}
}
pub struct Iter<'a, T, C> {
inner: map::Keys<'a, T, (), C>,
}
impl<'a, T, C: Slab<Node<T, ()>>> Iterator for Iter<'a, T, C>
where
C: SimpleCollectionRef,
{
type Item = &'a T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<&'a T> {
self.inner.next()
}
}
impl<'a, T, C: Slab<Node<T, ()>>> DoubleEndedIterator for Iter<'a, T, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn next_back(&mut self) -> Option<&'a T> {
self.inner.next_back()
}
}
impl<'a, T, C: Slab<Node<T, ()>>> FusedIterator for Iter<'a, T, C> where C: SimpleCollectionRef {}
impl<'a, T, C: Slab<Node<T, ()>>> ExactSizeIterator for Iter<'a, T, C> where C: SimpleCollectionRef {}
pub struct IntoIter<T, C> {
inner: map::IntoKeys<T, (), C>,
}
impl<T, C: SlabMut<Node<T, ()>>> Iterator for IntoIter<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<T> {
self.inner.next()
}
}
impl<T, C: SlabMut<Node<T, ()>>> DoubleEndedIterator for IntoIter<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
fn next_back(&mut self) -> Option<T> {
self.inner.next_back()
}
}
impl<T, C: SlabMut<Node<T, ()>>> FusedIterator for IntoIter<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<T, C: SlabMut<Node<T, ()>>> ExactSizeIterator for IntoIter<T, C>
where
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
pub struct Union<'a, T, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
it1: Peekable<Iter<'a, T, C>>,
it2: Peekable<Iter<'a, T, D>>,
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> Iterator for Union<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
type Item = &'a T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
let len1 = self.it1.len();
let len2 = self.it2.len();
(std::cmp::min(len1, len2), Some(std::cmp::max(len1, len2)))
}
#[inline]
fn next(&mut self) -> Option<&'a T> {
match (self.it1.peek(), self.it2.peek()) {
(Some(v1), Some(v2)) => match v1.cmp(v2) {
Ordering::Equal => {
self.it1.next();
self.it2.next()
}
Ordering::Less => self.it1.next(),
Ordering::Greater => self.it2.next(),
},
(Some(_), None) => self.it1.next(),
(None, Some(_)) => self.it2.next(),
(None, None) => None,
}
}
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> FusedIterator for Union<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
}
pub struct Intersection<'a, T, C, D: Slab<Node<T, ()>>>
where
D: SimpleCollectionRef,
{
it1: Iter<'a, T, C>,
it2: Peekable<Iter<'a, T, D>>,
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> Iterator for Intersection<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
type Item = &'a T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
let len1 = self.it1.len();
let len2 = self.it2.len();
(0, Some(std::cmp::min(len1, len2)))
}
#[inline]
fn next(&mut self) -> Option<&'a T> {
loop {
match self.it1.next() {
Some(value) => {
let keep = loop {
match self.it2.peek() {
Some(other) => match value.cmp(other) {
Ordering::Equal => break true,
Ordering::Greater => {
self.it2.next();
}
Ordering::Less => break false,
},
None => break false,
}
};
if keep {
break Some(value);
}
}
None => break None,
}
}
}
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> FusedIterator
for Intersection<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
}
pub struct Difference<'a, T, C, D: Slab<Node<T, ()>>>
where
D: SimpleCollectionRef,
{
it1: Iter<'a, T, C>,
it2: Peekable<Iter<'a, T, D>>,
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> Iterator for Difference<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
type Item = &'a T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
let len1 = self.it1.len();
let len2 = self.it2.len();
(len1.saturating_sub(len2), Some(self.it1.len()))
}
#[inline]
fn next(&mut self) -> Option<&'a T> {
loop {
match self.it1.next() {
Some(value) => {
let keep = loop {
match self.it2.peek() {
Some(other) => match value.cmp(other) {
Ordering::Equal => break false,
Ordering::Greater => {
self.it2.next();
}
Ordering::Less => break true,
},
None => break true,
}
};
if keep {
break Some(value);
}
}
None => break None,
}
}
}
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> FusedIterator
for Difference<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
}
pub struct SymmetricDifference<'a, T, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
it1: Peekable<Iter<'a, T, C>>,
it2: Peekable<Iter<'a, T, D>>,
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> Iterator
for SymmetricDifference<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
type Item = &'a T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
let len1 = self.it1.len();
let len2 = self.it2.len();
(0, len1.checked_add(len2))
}
#[inline]
fn next(&mut self) -> Option<&'a T> {
loop {
match (self.it1.peek(), self.it2.peek()) {
(Some(v1), Some(v2)) => match v1.cmp(v2) {
Ordering::Equal => {
self.it1.next();
self.it2.next();
}
Ordering::Less => break self.it1.next(),
Ordering::Greater => break self.it2.next(),
},
(Some(_), None) => break self.it1.next(),
(None, Some(_)) => break self.it2.next(),
(None, None) => break None,
}
}
}
}
impl<'a, T: Ord, C: Slab<Node<T, ()>>, D: Slab<Node<T, ()>>> FusedIterator
for SymmetricDifference<'a, T, C, D>
where
C: SimpleCollectionRef,
D: SimpleCollectionRef,
{
}
pub struct DrainFilter<'a, T, C: SlabMut<Node<T, ()>>, F>
where
F: FnMut(&T) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
pred: F,
inner: map::DrainFilterInner<'a, T, (), C>,
}
impl<'a, T: 'a, C: SlabMut<Node<T, ()>>, F> DrainFilter<'a, T, C, F>
where
F: FnMut(&T) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
#[inline]
pub fn new(set: &'a mut BTreeSet<T, C>, pred: F) -> Self {
DrainFilter {
pred,
inner: map::DrainFilterInner::new(&mut set.map),
}
}
}
impl<'a, T, C: SlabMut<Node<T, ()>>, F> FusedIterator for DrainFilter<'a, T, C, F>
where
F: FnMut(&T) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
}
impl<'a, T, C: SlabMut<Node<T, ()>>, F> Iterator for DrainFilter<'a, T, C, F>
where
F: FnMut(&T) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
type Item = T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<T> {
let pred = &mut self.pred;
self.inner.next(&mut |t, _| (*pred)(t)).map(|(t, ())| t)
}
}
impl<'a, T, C: SlabMut<Node<T, ()>>, F> Drop for DrainFilter<'a, T, C, F>
where
F: FnMut(&T) -> bool,
C: SimpleCollectionRef,
C: SimpleCollectionMut,
{
fn drop(&mut self) {
loop {
if self.next().is_none() {
break;
}
}
}
}
pub struct Range<'a, T, C> {
inner: map::Range<'a, T, (), C>,
}
impl<'a, T, C: Slab<Node<T, ()>>> Iterator for Range<'a, T, C>
where
C: SimpleCollectionRef,
{
type Item = &'a T;
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
self.inner.size_hint()
}
#[inline]
fn next(&mut self) -> Option<&'a T> {
self.inner.next().map(|(k, ())| k)
}
}
impl<'a, T, C: Slab<Node<T, ()>>> DoubleEndedIterator for Range<'a, T, C>
where
C: SimpleCollectionRef,
{
#[inline]
fn next_back(&mut self) -> Option<&'a T> {
self.inner.next_back().map(|(k, ())| k)
}
}
impl<'a, T, C: Slab<Node<T, ()>>> FusedIterator for Range<'a, T, C> where C: SimpleCollectionRef {}