use std::cmp::{
min,
Ordering,
};
#[allow(clippy::len_without_is_empty)]
pub trait BitString {
fn get(&self, ndx: usize) -> bool;
fn set(&mut self, ndx: usize, bit: bool);
fn flip(&mut self, ndx: usize);
#[allow(clippy::len_without_is_empty)]
fn len(&self) -> usize;
fn clip(&mut self, len: usize);
fn append(&mut self, bit: bool);
fn null() -> Self;
fn shared_prefix_len(&self, other: &Self) -> usize {
let max_len = min(self.len(), other.len());
for i in 0..max_len {
if self.get(i) != other.get(i) {
return i;
}
}
max_len
}
fn shared_prefix(&self, other: &Self) -> Self
where
Self: Clone,
{
let mut a = self.clone();
a.clip(self.shared_prefix_len(other));
a
}
fn subset_cmp(&self, other: &Self) -> Option<Ordering> {
let spl = self.shared_prefix_len(other);
if spl == self.len() {
if spl == other.len() {
Some(Ordering::Equal)
} else {
Some(Ordering::Greater)
}
} else if spl == other.len() {
Some(Ordering::Less)
} else {
None
}
}
fn lexicographic_cmp(&self, other: &Self) -> Ordering {
let spl = self.shared_prefix_len(other);
if spl == self.len() {
if spl == other.len() {
Ordering::Equal
} else {
Ordering::Less
}
} else if spl == other.len() {
Ordering::Greater
} else {
if self.get(spl) {
Ordering::Greater
} else {
Ordering::Less
}
}
}
}