use std::{fmt::Debug, mem, slice};
#[derive(Clone)]
pub(crate) enum SmallVec1<T> {
Empty,
One(T),
Many(Vec<T>),
}
impl<T: Debug> Debug for SmallVec1<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_list().entries(self.as_slice()).finish()
}
}
impl<T> SmallVec1<T> {
pub(crate) fn as_slice(&self) -> &[T] {
match self {
SmallVec1::Empty => &[],
SmallVec1::One(x) => slice::from_ref(x),
SmallVec1::Many(xs) => xs,
}
}
pub(crate) fn extend(&mut self, that: SmallVec1<T>) {
*self = match (mem::replace(self, SmallVec1::Empty), that) {
(SmallVec1::Empty, right) => right,
(left, SmallVec1::Empty) => left,
(SmallVec1::One(left), SmallVec1::One(right)) => SmallVec1::Many(vec![left, right]),
(SmallVec1::One(left), SmallVec1::Many(mut right)) => {
right.insert(0, left);
SmallVec1::Many(right)
}
(SmallVec1::Many(mut left), SmallVec1::One(right)) => {
left.push(right);
SmallVec1::Many(left)
}
(SmallVec1::Many(mut left), SmallVec1::Many(right)) => {
left.extend(right);
SmallVec1::Many(left)
}
}
}
}