use std::borrow::Borrow;
use std::cmp::Ordering;
use std::fmt;
use std::iter::FromIterator;
use std::ops::{BitAnd, BitOr, BitXor, RangeBounds, Sub};
pub use crate::map;
use map::{AvlTreeMap, IntoIter as MapIntoIter, Iter as MapIter, Range as MapRange};
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AvlTreeSet<T> {
map: AvlTreeMap<T, ()>,
}
pub struct Iter<'a, T> {
map_iter: MapIter<'a, T, ()>,
}
pub struct Range<'a, T> {
map_range: MapRange<'a, T, ()>,
}
pub struct IntoIter<T> {
map_into_iter: MapIntoIter<T, ()>,
}
pub struct Union<'a, T> {
lhs_iter: Iter<'a, T>,
rhs_iter: Iter<'a, T>,
}
pub struct Intersection<'a, T> {
lhs: &'a AvlTreeSet<T>,
lhs_range: Range<'a, T>,
rhs: &'a AvlTreeSet<T>,
rhs_range: Range<'a, T>,
}
pub struct Difference<'a, T> {
lhs_range: Range<'a, T>,
rhs: &'a AvlTreeSet<T>,
rhs_range: Range<'a, T>,
}
pub struct SymmetricDifference<'a, T> {
lhs_iter: Iter<'a, T>,
rhs_iter: Iter<'a, T>,
}
impl<T: Ord> AvlTreeSet<T> {
pub fn new() -> Self {
Self {
map: AvlTreeMap::new(),
}
}
}
impl<T> AvlTreeSet<T> {
pub fn is_empty(&self) -> bool {
self.map.is_empty()
}
pub fn len(&self) -> usize {
self.map.len()
}
pub fn clear(&mut self) {
self.map.clear();
}
pub fn iter(&self) -> Iter<'_, T> {
Iter {
map_iter: self.map.iter(),
}
}
pub fn get<Q>(&self, value: &Q) -> Option<&T>
where
T: Borrow<Q>,
Q: Ord + ?Sized,
{
self.map.get_key_value(value).map(|kv| kv.0)
}
pub fn contains<Q>(&self, value: &Q) -> bool
where
T: Borrow<Q>,
Q: Ord + ?Sized,
{
self.map.contains_key(value)
}
pub fn remove<Q>(&mut self, value: &Q) -> bool
where
T: Borrow<Q>,
Q: Ord + ?Sized,
{
self.map.remove(value).is_some()
}
pub fn take<Q>(&mut self, value: &Q) -> Option<T>
where
T: Borrow<Q>,
Q: Ord + ?Sized,
{
self.map.remove_entry(value).map(|(k, _)| k)
}
pub fn range<Q, R>(&self, range: R) -> Range<'_, T>
where
T: Borrow<Q>,
R: RangeBounds<Q>,
Q: Ord + ?Sized,
{
Range {
map_range: self.map.range(range),
}
}
}
impl<T: Ord> AvlTreeSet<T> {
pub fn insert(&mut self, value: T) -> bool {
self.map.insert(value, ()).is_none()
}
pub fn append(&mut self, other: &mut Self) {
self.map.append(&mut other.map);
}
pub fn split_off<Q>(&mut self, key: &Q) -> Self
where
T: Borrow<Q>,
Q: ?Sized + Ord,
{
Self {
map: self.map.split_off(key),
}
}
pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
Union::new(self, other)
}
pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
Intersection::new(self, other)
}
pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T> {
Difference::new(self, other)
}
pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T> {
SymmetricDifference::new(self, other)
}
pub fn is_disjoint(&self, other: &Self) -> bool {
self.intersection(other).next().is_none()
}
pub fn is_subset(&self, other: &Self) -> bool {
if self.len() > other.len() {
return false;
}
for v in self {
if !other.contains(v) {
return false;
}
}
true
}
pub fn is_superset(&self, other: &Self) -> bool {
other.is_subset(self)
}
#[cfg(any(test, feature = "consistency_check"))]
pub fn check_consistency(&self) {
self.map.check_consistency()
}
}
impl<T: Ord> Default for AvlTreeSet<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: Ord> FromIterator<T> for AvlTreeSet<T> {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let mut set = Self::new();
for value in iter {
set.insert(value);
}
set
}
}
impl<T: fmt::Debug> fmt::Debug for AvlTreeSet<T> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.debug_set().entries(self.iter()).finish()
}
}
impl<'a, T> IntoIterator for &'a AvlTreeSet<T> {
type Item = &'a T;
type IntoIter = Iter<'a, T>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
}
}
impl<T> IntoIterator for AvlTreeSet<T> {
type Item = T;
type IntoIter = IntoIter<T>;
fn into_iter(self) -> Self::IntoIter {
Self::IntoIter {
map_into_iter: self.map.into_iter(),
}
}
}
impl<T: Ord> Extend<T> for AvlTreeSet<T> {
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = T>,
{
iter.into_iter().for_each(move |value| {
self.insert(value);
});
}
}
impl<'a, T> Extend<&'a T> for AvlTreeSet<T>
where
T: Ord + Copy,
T: 'a,
{
fn extend<I>(&mut self, iter: I)
where
I: IntoIterator<Item = &'a T>,
{
self.extend(iter.into_iter().copied());
}
}
impl<T: Ord + Clone> BitOr<&AvlTreeSet<T>> for &AvlTreeSet<T> {
type Output = AvlTreeSet<T>;
fn bitor(self, rhs: &AvlTreeSet<T>) -> AvlTreeSet<T> {
self.union(rhs).cloned().collect()
}
}
impl<T: Ord + Clone> BitAnd<&AvlTreeSet<T>> for &AvlTreeSet<T> {
type Output = AvlTreeSet<T>;
fn bitand(self, rhs: &AvlTreeSet<T>) -> AvlTreeSet<T> {
self.intersection(rhs).cloned().collect()
}
}
impl<T: Ord + Clone> Sub<&AvlTreeSet<T>> for &AvlTreeSet<T> {
type Output = AvlTreeSet<T>;
fn sub(self, rhs: &AvlTreeSet<T>) -> AvlTreeSet<T> {
self.difference(rhs).cloned().collect()
}
}
impl<T: Ord + Clone> BitXor<&AvlTreeSet<T>> for &AvlTreeSet<T> {
type Output = AvlTreeSet<T>;
fn bitxor(self, rhs: &AvlTreeSet<T>) -> AvlTreeSet<T> {
self.symmetric_difference(rhs).cloned().collect()
}
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.map_iter.next().map(|(k, _)| k)
}
}
impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
fn next_back(&mut self) -> Option<Self::Item> {
self.map_iter.next_back().map(|(k, _)| k)
}
}
impl<'a, T> Clone for Iter<'a, T> {
fn clone(&self) -> Self {
Self {
map_iter: self.map_iter.clone(),
}
}
}
impl<T: fmt::Debug> fmt::Debug for Iter<'_, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.map_iter.fmt_keys(f)
}
}
impl<'a, T> Iter<'a, T> {
fn peek(&self) -> Option<<Self as Iterator>::Item> {
self.map_iter.peek().map(|(k, _)| k)
}
}
impl<'a, T> Iterator for Range<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.map_range.next().map(|(k, _)| k)
}
}
impl<'a, T> DoubleEndedIterator for Range<'a, T> {
fn next_back(&mut self) -> Option<Self::Item> {
self.map_range.next_back().map(|(k, _)| k)
}
}
impl<'a, T> Clone for Range<'a, T> {
fn clone(&self) -> Self {
Self {
map_range: self.map_range.clone(),
}
}
}
impl<T: fmt::Debug> fmt::Debug for Range<'_, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.map_range.fmt_keys(f)
}
}
impl<'a, T> Range<'a, T> {
fn peek(&self) -> Option<<Self as Iterator>::Item> {
self.map_range.peek().map(|(k, _)| k)
}
}
impl<T> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.map_into_iter.next().map(|(k, _)| k)
}
}
impl<T> DoubleEndedIterator for IntoIter<T> {
fn next_back(&mut self) -> Option<Self::Item> {
self.map_into_iter.next_back().map(|(k, _)| k)
}
}
impl<T: fmt::Debug> fmt::Debug for IntoIter<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.map_into_iter.fmt_keys(f)
}
}
impl<'a, T: Ord> Union<'a, T> {
fn new(lhs: &'a AvlTreeSet<T>, rhs: &'a AvlTreeSet<T>) -> Self {
Self {
lhs_iter: lhs.iter(),
rhs_iter: rhs.iter(),
}
}
}
impl<'a, T> Clone for Union<'a, T> {
fn clone(&self) -> Self {
Self {
lhs_iter: self.lhs_iter.clone(),
rhs_iter: self.rhs_iter.clone(),
}
}
}
impl<'a, T: Ord + fmt::Debug> fmt::Debug for Union<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Union")?;
f.debug_set().entries(self.clone()).finish()
}
}
impl<'a, T: Ord> Iterator for Union<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
match (self.lhs_iter.peek(), self.rhs_iter.peek()) {
(None, None) => None,
(Some(lhs), None) => {
self.lhs_iter.next();
Some(lhs)
}
(None, Some(rhs)) => {
self.rhs_iter.next();
Some(rhs)
}
(Some(lhs), Some(rhs)) => match lhs.cmp(rhs) {
Ordering::Less => {
self.lhs_iter.next();
Some(lhs)
}
Ordering::Equal => {
self.lhs_iter.next();
self.rhs_iter.next();
Some(lhs)
}
Ordering::Greater => {
self.rhs_iter.next();
Some(rhs)
}
},
}
}
}
impl<'a, T: Ord> Intersection<'a, T> {
fn new(lhs: &'a AvlTreeSet<T>, rhs: &'a AvlTreeSet<T>) -> Self {
Self {
lhs,
lhs_range: lhs.range(..),
rhs,
rhs_range: rhs.range(..),
}
}
}
impl<'a, T> Clone for Intersection<'a, T> {
fn clone(&self) -> Self {
Self {
lhs: self.lhs,
lhs_range: self.lhs_range.clone(),
rhs: self.rhs,
rhs_range: self.rhs_range.clone(),
}
}
}
impl<'a, T: Ord + fmt::Debug> fmt::Debug for Intersection<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Intersection")?;
f.debug_set().entries(self.clone()).finish()
}
}
impl<'a, T: Ord> Iterator for Intersection<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
loop {
match (self.lhs_range.peek(), self.rhs_range.peek()) {
(None, _) | (_, None) => return None,
(Some(lhs), Some(rhs)) => match lhs.cmp(rhs) {
Ordering::Equal => {
self.lhs_range.next();
self.rhs_range.next();
return Some(lhs);
}
Ordering::Less => {
self.lhs
.map
.reset_range_start_bound_included(&mut self.lhs_range.map_range, rhs);
}
Ordering::Greater => {
self.rhs
.map
.reset_range_start_bound_included(&mut self.rhs_range.map_range, lhs);
}
},
}
}
}
}
impl<'a, T: Ord> Difference<'a, T> {
fn new(lhs: &'a AvlTreeSet<T>, rhs: &'a AvlTreeSet<T>) -> Self {
Self {
lhs_range: lhs.range(..),
rhs,
rhs_range: rhs.range(..),
}
}
}
impl<'a, T> Clone for Difference<'a, T> {
fn clone(&self) -> Self {
Self {
lhs_range: self.lhs_range.clone(),
rhs: self.rhs,
rhs_range: self.rhs_range.clone(),
}
}
}
impl<'a, T: Ord + fmt::Debug> fmt::Debug for Difference<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Difference")?;
f.debug_set().entries(self.clone()).finish()
}
}
impl<'a, T: Ord> Iterator for Difference<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
loop {
match (self.lhs_range.peek(), self.rhs_range.peek()) {
(None, _) => return None,
(Some(lhs), None) => {
self.lhs_range.next();
return Some(lhs);
}
(Some(lhs), Some(rhs)) => match lhs.cmp(rhs) {
Ordering::Equal => {
self.lhs_range.next();
self.rhs_range.next();
}
Ordering::Less => {
self.lhs_range.next();
return Some(lhs);
}
Ordering::Greater => {
self.rhs
.map
.reset_range_start_bound_included(&mut self.rhs_range.map_range, lhs);
}
},
}
}
}
}
impl<'a, T: Ord> SymmetricDifference<'a, T> {
fn new(lhs: &'a AvlTreeSet<T>, rhs: &'a AvlTreeSet<T>) -> Self {
Self {
lhs_iter: lhs.iter(),
rhs_iter: rhs.iter(),
}
}
}
impl<'a, T> Clone for SymmetricDifference<'a, T> {
fn clone(&self) -> Self {
Self {
lhs_iter: self.lhs_iter.clone(),
rhs_iter: self.rhs_iter.clone(),
}
}
}
impl<'a, T: Ord + fmt::Debug> fmt::Debug for SymmetricDifference<'a, T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "SymmetricDifference")?;
f.debug_set().entries(self.clone()).finish()
}
}
impl<'a, T: Ord> Iterator for SymmetricDifference<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
loop {
match (self.lhs_iter.peek(), self.rhs_iter.peek()) {
(None, None) => return None,
(Some(lhs), None) => {
self.lhs_iter.next();
return Some(lhs);
}
(None, Some(rhs)) => {
self.rhs_iter.next();
return Some(rhs);
}
(Some(lhs), Some(rhs)) => match lhs.cmp(rhs) {
Ordering::Less => {
self.lhs_iter.next();
return Some(lhs);
}
Ordering::Equal => {
self.lhs_iter.next();
self.rhs_iter.next();
}
Ordering::Greater => {
self.rhs_iter.next();
return Some(rhs);
}
},
}
}
}
}