use smallvec::SmallVec; #[cfg(test)] mod tests; /// Like SmallVec but for strings. #[derive(Default)] pub struct SmallStr(SmallVec<[u8; N]>); impl SmallStr { #[inline] pub fn new() -> Self { SmallStr(SmallVec::default()) } #[inline] pub fn push_str(&mut self, s: &str) { self.0.extend_from_slice(s.as_bytes()); } #[inline] pub fn empty(&self) -> bool { self.0.is_empty() } #[inline] pub fn spilled(&self) -> bool { self.0.spilled() } #[inline] pub fn as_str(&self) -> &str { unsafe { std::str::from_utf8_unchecked(self.0.as_slice()) } } } impl std::ops::Deref for SmallStr { type Target = str; #[inline] fn deref(&self) -> &str { self.as_str() } } impl> FromIterator for SmallStr { #[inline] fn from_iter(iter: T) -> Self where T: IntoIterator, { let mut s = SmallStr::default(); s.extend(iter); s } } impl> Extend for SmallStr { #[inline] fn extend(&mut self, iter: T) where T: IntoIterator, { for a in iter.into_iter() { self.push_str(a.as_ref()); } } }