use std::hash::Hash;
use std::slice;
use std::vec;
use allocative::Allocative;
#[cfg(feature = "pagable_dep")]
use pagable::Pagable;
use serde::Deserialize;
use serde::Serialize;
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Allocative,
Default,
Serialize,
Deserialize
)]
#[cfg_attr(feature = "pagable_dep", derive(Pagable))]
pub struct SortedVec<T> {
vec: Vec<T>,
}
impl<T> SortedVec<T> {
#[inline]
pub const fn new() -> SortedVec<T> {
SortedVec { vec: Vec::new() }
}
#[inline]
pub fn new_unchecked(vec: Vec<T>) -> SortedVec<T>
where
T: Ord,
{
debug_assert!(vec.iter().zip(vec.iter().skip(1)).all(|(a, b)| a <= b));
SortedVec { vec }
}
#[inline]
pub fn iter(&self) -> slice::Iter<'_, T> {
self.vec.iter()
}
}
impl<T: Ord> From<Vec<T>> for SortedVec<T> {
#[inline]
fn from(mut vec: Vec<T>) -> Self {
vec.sort();
SortedVec { vec }
}
}
impl<T: Ord> FromIterator<T> for SortedVec<T> {
#[inline]
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let vec = Vec::from_iter(iter);
SortedVec::from(vec)
}
}
impl<T> IntoIterator for SortedVec<T> {
type Item = T;
type IntoIter = vec::IntoIter<T>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.vec.into_iter()
}
}
#[cfg(test)]
mod tests {
#[cfg(debug_assertions)]
#[test]
#[should_panic]
fn test_new_unchecked() {
use crate::sorted_vec::SortedVec;
SortedVec::new_unchecked(vec![1, 3, 2]);
}
}