2018-06-15 11:02:36 +01:00
|
|
|
use std::io;
|
|
|
|
|
|
|
|
pub struct StackVec<'a, T: 'a> {
|
|
|
|
data: &'a mut [T],
|
|
|
|
length: usize,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, T> StackVec<'a, T> {
|
|
|
|
pub fn from(data: &mut [T]) -> StackVec<T> {
|
2018-12-06 23:58:31 +00:00
|
|
|
StackVec { data, length: 0 }
|
2018-06-15 11:02:36 +01:00
|
|
|
}
|
|
|
|
|
2018-06-24 11:20:18 +01:00
|
|
|
pub fn as_slice(&self) -> &[T] {
|
|
|
|
&self.data[0..self.length]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, T> Extend<T> for StackVec<'a, T> {
|
2018-12-06 23:58:31 +00:00
|
|
|
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
|
2018-06-24 11:20:18 +01:00
|
|
|
for item in iter {
|
|
|
|
self.data[self.length] = item;
|
|
|
|
self.length += 1;
|
|
|
|
}
|
|
|
|
}
|
2018-06-15 11:02:36 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a> io::Write for StackVec<'a, u8> {
|
|
|
|
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
|
|
|
if buf.len() > (self.data.len() - self.length) {
|
|
|
|
// not enough space on buffer.
|
|
|
|
return Err(io::Error::from(io::ErrorKind::WriteZero));
|
|
|
|
}
|
2018-06-24 11:20:18 +01:00
|
|
|
let writable = &mut self.data[self.length..][0..buf.len()];
|
2018-06-15 11:02:36 +01:00
|
|
|
writable.copy_from_slice(buf);
|
|
|
|
self.length += buf.len();
|
|
|
|
Ok(buf.len())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn flush(&mut self) -> io::Result<()> {
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn vec_write() {
|
|
|
|
use std::io::Write;
|
|
|
|
|
|
|
|
let mut buf = [0u8; 200];
|
|
|
|
{
|
|
|
|
let mut vec = StackVec::from(&mut buf);
|
|
|
|
assert!(vec.write("Hello World!".as_bytes()).is_ok());
|
|
|
|
}
|
|
|
|
assert_eq!(buf[1] as char, 'e');
|
|
|
|
}
|
2018-12-06 23:58:31 +00:00
|
|
|
}
|