#[cfg(feature = "smallvec")]
use smallvec::SmallVec;
use crate::vendor::rle::MergableSpan;
pub trait AppendRle<T: MergableSpan> {
fn push_rle(&mut self, item: T) -> bool;
fn push_reversed_rle(&mut self, item: T) -> bool;
fn extend_rle<I: IntoIterator<Item = T>>(&mut self, iter: I) {
for item in iter {
self.push_rle(item);
}
}
}
impl<T: MergableSpan> AppendRle<T> for Vec<T> {
fn push_rle(&mut self, item: T) -> bool {
if let Some(v) = self.last_mut() {
if v.can_append(&item) {
v.append(item);
return true;
}
}
self.push(item);
false
}
fn push_reversed_rle(&mut self, item: T) -> bool {
if let Some(v) = self.last_mut() {
if item.can_append(v) {
v.prepend(item);
return true;
}
}
self.push(item);
false
}
}
#[cfg(feature = "smallvec")]
impl<T, const N: usize> AppendRle<T> for SmallVec<T, N> where T: MergableSpan {
fn push_rle(&mut self, item: T) -> bool {
if let Some(v) = self.last_mut() {
if v.can_append(&item) {
v.append(item);
return true;
}
}
self.push(item);
false
}
fn push_reversed_rle(&mut self, item: T) -> bool {
if let Some(v) = self.last_mut() {
if item.can_append(v) {
v.prepend(item);
return true;
}
}
self.push(item);
false
}
}