69 lines
1.3 KiB
Rust
69 lines
1.3 KiB
Rust
use smallvec::SmallVec;
|
|
|
|
#[cfg(test)]
|
|
mod tests;
|
|
|
|
/// Like SmallVec but for strings.
|
|
#[derive(Default)]
|
|
pub struct SmallStr<const N: usize>(SmallVec<[u8; N]>);
|
|
|
|
impl<const N: usize> SmallStr<N> {
|
|
#[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<const N: usize> std::ops::Deref for SmallStr<N> {
|
|
type Target = str;
|
|
|
|
#[inline]
|
|
fn deref(&self) -> &str {
|
|
self.as_str()
|
|
}
|
|
}
|
|
|
|
impl<const N: usize, A: AsRef<str>> FromIterator<A> for SmallStr<N> {
|
|
#[inline]
|
|
fn from_iter<T>(iter: T) -> Self
|
|
where
|
|
T: IntoIterator<Item = A>,
|
|
{
|
|
let mut s = SmallStr::default();
|
|
s.extend(iter);
|
|
s
|
|
}
|
|
}
|
|
|
|
impl<const N: usize, A: AsRef<str>> Extend<A> for SmallStr<N> {
|
|
#[inline]
|
|
fn extend<T>(&mut self, iter: T)
|
|
where
|
|
T: IntoIterator<Item = A>,
|
|
{
|
|
for a in iter.into_iter() {
|
|
self.push_str(a.as_ref());
|
|
}
|
|
}
|
|
}
|