use crate::build_set_bit_ops;
use crate::Set;
use crate::VecSet;
use core::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Sub, SubAssign};
use crate::Element;
impl<'a, E: Element> BitAnd<&'a VecSet<E>> for &'a VecSet<E> {
type Output = VecSet<E>;
#[inline]
fn bitand(self, rhs: &'a VecSet<E>) -> Self::Output {
VecSet {
elements: self.intersection(rhs).copied().collect(),
}
}
}
impl<'a, E: Element> BitOr<&'a VecSet<E>> for &VecSet<E> {
type Output = VecSet<E>;
#[inline]
fn bitor(self, rhs: &'a VecSet<E>) -> VecSet<E> {
VecSet {
elements: self.union(rhs).copied().collect(),
}
}
}
impl<'a, E: Element> BitXor<&'a VecSet<E>> for &VecSet<E> {
type Output = VecSet<E>;
#[inline]
fn bitxor(self, rhs: &'a VecSet<E>) -> VecSet<E> {
VecSet {
elements: self.symmetric_difference(rhs).copied().collect(),
}
}
}
impl<'a, E: Element> Sub<&'a VecSet<E>> for &VecSet<E> {
type Output = VecSet<E>;
#[inline]
fn sub(self, rhs: &'a VecSet<E>) -> VecSet<E> {
VecSet {
elements: self.difference(rhs).copied().collect(),
}
}
}
impl<E: Element> BitXorAssign<VecSet<E>> for VecSet<E> {
#[inline]
fn bitxor_assign(&mut self, rhs: VecSet<E>) {
for item in rhs.elements {
if self.contains(&item) {
self.remove(&item);
} else {
self.insert(item);
}
}
}
}
build_set_bit_ops!(VecSet<E>);