use crate::set::PetitSet;
#[cfg(feature = "set_algebra")]
use crate::set::PetitSetIter;
impl<T: Eq + Clone, const CAP: usize> PetitSet<T, CAP> {
#[cfg(feature = "set_algebra")]
pub fn difference<const OTHER_CAP: usize>(
&self,
other: &PetitSet<T, OTHER_CAP>,
) -> PetitSetIter<T, CAP> {
let mut iter: PetitSetIter<T, CAP> = PetitSetIter::default();
for s in self.iter() {
if !other.contains(s) {
iter.set.insert_unchecked(s.clone());
}
}
iter
}
#[cfg(feature = "set_algebra")]
pub fn symmetric_difference<const OTHER_CAP: usize>(
&self,
other: &PetitSet<T, OTHER_CAP>,
) -> PetitSetIter<T, { CAP + OTHER_CAP }> {
let mut iter: PetitSetIter<T, { CAP + OTHER_CAP }> = PetitSetIter::default();
for s in self.iter() {
if !other.contains(s) {
iter.set.insert_unchecked(s.clone());
}
}
for o in other.iter() {
if !self.contains(o) {
iter.set.insert_unchecked(o.clone());
}
}
iter
}
#[cfg(feature = "set_algebra")]
pub fn intersection<const OTHER_CAP: usize>(
&self,
other: &PetitSet<T, OTHER_CAP>,
) -> PetitSetIter<T, { max_of(CAP, OTHER_CAP) }> {
let mut iter: PetitSetIter<T, { max_of(CAP, OTHER_CAP) }> = PetitSetIter::default();
for s in self.iter() {
if other.contains(s) {
iter.set.insert_unchecked(s.clone());
}
}
iter
}
#[cfg(feature = "set_algebra")]
pub fn union<const OTHER_CAP: usize>(
&self,
other: &PetitSet<T, OTHER_CAP>,
) -> PetitSetIter<T, { CAP + OTHER_CAP }> {
let mut iter: PetitSetIter<T, { CAP + OTHER_CAP }> = PetitSetIter::default();
for s in self.iter() {
iter.set.insert_unchecked(s.clone());
}
for o in other.iter() {
iter.set.insert(o.clone());
}
iter
}
pub fn is_disjoint<const OTHER_CAP: usize>(&self, other: &PetitSet<T, OTHER_CAP>) -> bool {
for s in self.iter() {
for o in other.iter() {
if s == o {
return false;
}
}
}
true
}
pub fn is_subset<const OTHER_CAP: usize>(&self, other: &PetitSet<T, OTHER_CAP>) -> bool {
'outer: for s in self.iter() {
'_inner: for o in other.iter() {
if s == o {
continue 'outer;
}
}
return false;
}
true
}
pub fn is_superset<const OTHER_CAP: usize>(&self, other: &PetitSet<T, OTHER_CAP>) -> bool {
'outer: for o in other.iter() {
'_inner: for s in self.iter() {
if o == s {
continue 'outer;
}
}
return false;
}
true
}
}
pub const fn max_of(a: usize, b: usize) -> usize {
if a >= b {
a
} else {
b
}
}