diff --git a/melib/src/structs.rs b/melib/src/structs.rs index 3111bfc62..8cb029ced 100644 --- a/melib/src/structs.rs +++ b/melib/src/structs.rs @@ -1,4 +1,4 @@ -use std::iter::Extend; +use std::iter::{Extend, FromIterator}; use std::ops::Index; #[derive(Debug, Default)] @@ -58,6 +58,18 @@ impl StackVec { range: 0..self.len, } } + pub fn remove(&mut self, i: usize) -> T { + if self.len >= self.array.len() { + self.heap_vec.remove(i) + } else { + let ret = std::mem::replace(&mut self.array[i], T::default()); + self.len -= 1; + for i in i..self.len { + self.array[i] = self.array[i + 1]; + } + ret + } + } } pub struct StackVecIter<'a, T: Default + Copy + std::fmt::Debug> { @@ -113,3 +125,44 @@ impl Extend for StackVec { } } } + +impl FromIterator for StackVec { + fn from_iter>(iter: I) -> Self { + let mut c = StackVec::new(); + + for i in iter { + c.push(i); + } + + c + } +} + +pub struct StackVecIterOwned(StackVec); +impl IntoIterator for StackVec { + type Item = T; + type IntoIter = StackVecIterOwned; + + fn into_iter(self) -> Self::IntoIter { + StackVecIterOwned(self) + } +} +impl Iterator for StackVecIterOwned { + type Item = T; + fn next(&mut self) -> Option { + if self.0.is_empty() { + None + } else { + Some(self.0.remove(0)) + } + } +} +impl std::iter::DoubleEndedIterator for StackVecIterOwned { + fn next_back(&mut self) -> Option { + if self.0.is_empty() { + None + } else { + self.0.pop() + } + } +}