Path: blob/main/crates/polars-utils/src/enum_unit_vec.rs
6939 views
use either::Either;12/// List of items where a single item is stored on the stack.3/// Similar to UnitVec, but without size / alignment limitations.4#[derive(Debug, Clone)]5pub struct EnumUnitVec<T>(Either<[T; 1], Vec<T>>);67impl<T> EnumUnitVec<T> {8pub const fn new() -> Self {9Self(Either::Right(Vec::new()))10}1112pub const fn new_single(value: T) -> Self {13Self(Either::Left([value]))14}15}1617impl<T> Default for EnumUnitVec<T> {18fn default() -> Self {19Self::new()20}21}2223impl<T> std::ops::Deref for EnumUnitVec<T> {24type Target = [T];2526fn deref(&self) -> &Self::Target {27AsRef::as_ref(&self.0)28}29}3031impl<T> std::ops::DerefMut for EnumUnitVec<T> {32fn deref_mut(&mut self) -> &mut Self::Target {33AsMut::as_mut(&mut self.0)34}35}3637impl<T> From<Vec<T>> for EnumUnitVec<T> {38fn from(value: Vec<T>) -> Self {39Self(Either::Right(value))40}41}4243impl<T> IntoIterator for EnumUnitVec<T> {44type IntoIter = Either<<[T; 1] as IntoIterator>::IntoIter, <Vec<T> as IntoIterator>::IntoIter>;45type Item = T;4647fn into_iter(self) -> Self::IntoIter {48match self.0 {49Either::Left(v) => Either::Left(v.into_iter()),50Either::Right(v) => Either::Right(v.into_iter()),51}52}53}5455impl<T> FromIterator<T> for EnumUnitVec<T> {56fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {57let mut iter = iter.into_iter();5859let Some(first) = iter.next() else {60return Self::new();61};6263let Some(second) = iter.next() else {64return Self::new_single(first);65};6667let mut vec = Vec::with_capacity(iter.size_hint().0 + 2);68vec.push(first);69vec.push(second);70vec.extend(iter);71Self::from(vec)72}73}747576