use crate::search_by;
#[derive(Debug, Clone, Default, Hash, Eq, PartialEq, Ord, PartialOrd)]
pub struct AutoOrderedVec<T> {
data: Vec<T>,
}
impl<T> AutoOrderedVec<T> {
pub fn new() -> Self {
Self { data: Vec::new() }
}
pub fn with_capacity(capacity: usize) -> Self {
Self {
data: Vec::with_capacity(capacity),
}
}
pub fn get(&self, index: usize) -> Option<&T> {
self.data.get(index)
}
pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
self.data.get_mut(index)
}
}
impl<T: Ord> AutoOrderedVec<T> {
pub fn search(&self, item: &T) -> Result<usize, usize> {
search_by(&self.data, item, T::cmp)
}
pub fn insert(&mut self, item: T) -> usize {
let index = match self.search(&item) {
Ok(i) => i,
Err(i) => i,
};
self.data.insert(index, item);
index
}
pub fn insert_unique(&mut self, item: T) -> Option<usize> {
match self.search(&item) {
Err(index) => {
self.data.insert(index, item);
Some(index)
}
Ok(..) => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_auto_ordered_vec() {
let mut vec = AutoOrderedVec::new();
assert_eq!(vec.get(0), None);
assert_eq!(vec.get(1), None);
vec.insert(2);
assert_eq!(vec.get(0), Some(&2));
assert_eq!(vec.get(1), None);
vec.insert(1);
assert_eq!(vec.get(0), Some(&1));
assert_eq!(vec.get(1), Some(&2));
}
}