#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub(crate) struct IndexSet(Vec<usize>);
impl IndexSet {
pub(crate) fn new() -> IndexSet {
IndexSet(Vec::new())
}
pub(crate) fn from(mut set: Vec<usize>) -> IndexSet {
set.sort_unstable();
IndexSet(set)
}
pub(crate) fn from_sorted(set: Vec<usize>) -> IndexSet {
IndexSet(set)
}
pub(crate) fn iter(&self) -> std::slice::Iter<'_, usize> {
self.0.iter()
}
pub(crate) fn len(&self) -> usize {
self.0.len()
}
pub(crate) fn first(&self) -> Option<usize> {
self.iter().copied().next()
}
pub(crate) fn get(&self, pos: usize) -> usize {
self.0[pos]
}
pub(crate) fn contains(&self, x: usize) -> bool {
self.0.binary_search(&x).is_ok()
}
pub(crate) fn is_subset(&self, other: &IndexSet) -> bool {
if self.len() > other.len() {
return false;
}
let mut it = other.iter();
for &el in self {
loop {
match it.next() {
Some(&x) => {
if x > el {
return false;
} else if x == el {
break;
}
}
None => return false,
};
}
}
true
}
pub(crate) fn intersection(&self, other: &IndexSet) -> IndexSet {
let mut intersection_vec = Vec::new();
let mut it = other.iter().peekable();
for &el in self {
while let Some(&&x) = it.peek() {
if x < el {
it.next();
} else if x == el {
intersection_vec.push(el);
it.next();
} else {
break;
}
}
}
IndexSet::from_sorted(intersection_vec)
}
pub(crate) fn set_difference(&self, other: &IndexSet) -> IndexSet {
let mut set_difference_vec = Vec::new();
let mut it = other.iter().peekable();
for &el in self {
while let Some(&&x) = it.peek() {
if x < el {
it.next();
} else if x == el {
break;
} else {
set_difference_vec.push(el);
break;
}
}
if it.peek().is_none() {
set_difference_vec.push(el);
}
}
IndexSet::from_sorted(set_difference_vec)
}
pub(crate) fn equal_to_vec(&self, vec: &[usize]) -> bool {
if self.len() != vec.len() {
return false;
}
for &el in vec {
if !self.contains(el) {
return false;
}
}
true
}
pub(crate) fn to_vec(&self) -> Vec<usize> {
self.0.clone()
}
}
impl<'a> IntoIterator for &'a IndexSet {
type Item = &'a usize;
type IntoIter = std::slice::Iter<'a, usize>;
fn into_iter(self) -> Self::IntoIter {
self.0.iter()
}
}