use crate::prelude::*;
#[derive(Default,Clone)]
-pub struct Queue {
+pub struct QueueBuf<E> {
content: usize,
eaten1: usize, // 0 <= eaten1 < queue.front()...len()
- queue: VecDeque<Box<[u8]>>,
+ queue: VecDeque<E>,
}
-impl Queue {
- pub fn push<B: Into<Box<[u8]>>>(&mut self, b: B) {
+#[derive(Default,Debug,Clone)]
+pub struct FrameQueueBuf {
+ queue: QueueBuf<Cervine<'static, Box<[u8]>, [u8]>>,
+}
+
+impl<E> Debug for QueueBuf<E> where E: AsRef<[u8]> {
+ #[throws(fmt::Error)]
+ fn fmt(&self, f: &mut fmt::Formatter) {
+ write!(f, "Queue{{content={},eaten1={},queue=[",
+ self.content, self.eaten1)?;
+ for q in &self.queue { write!(f, "{},", q.as_ref().len())?; }
+ write!(f, "]}}")?;
+ }
+}
+
+impl<E> QueueBuf<E> where E: AsRef<[u8]> {
+ pub fn push<B: Into<E>>(&mut self, b: B) {
self.push_(b.into());
}
- pub fn push_(&mut self, b: Box<[u8]>) {
- let l = b.len();
- self.push(b);
+ pub fn push_(&mut self, b: E) {
+ let l = b.as_ref().len();
+ self.queue.push_back(b);
self.content += l;
}
pub fn is_empty(&self) -> bool { self.content == 0 }
}
-impl hyper::body::Buf for Queue {
+impl FrameQueueBuf {
+ pub fn push<B: Into<Box<[u8]>>>(&mut self, b: B) {
+ self.push_(b.into());
+ }
+ pub fn push_(&mut self, b: Box<[u8]>) {
+ self.queue.push_(Cervine::Owned(b));
+ self.queue.push_(Cervine::Borrowed(&SLIP_END_SLICE));
+ }
+ pub fn is_empty(&self) -> bool { self.queue.is_empty() }
+}
+
+impl<E> Extend<E> for FrameQueueBuf where E: Into<Box<[u8]>> {
+ fn extend<I>(&mut self, it: I)
+ where I: IntoIterator<Item=E>
+ {
+ for b in it { self.push(b) }
+ }
+}
+
+impl<E> hyper::body::Buf for QueueBuf<E> where E: AsRef<[u8]> {
fn remaining(&self) -> usize { self.content }
fn chunk(&self) -> &[u8] {
let front = if let Some(f) = self.queue.front() { f } else { return &[] };
- &front[ self.eaten1.. ]
+ &front.as_ref()[ self.eaten1.. ]
}
fn advance(&mut self, cnt: usize) {
self.content -= cnt;
loop {
if self.eaten1 == 0 { break }
let front = self.queue.front().unwrap();
- if self.eaten1 < front.len() { break; }
- self.eaten1 -= front.len();
+ if self.eaten1 < front.as_ref().len() { break; }
+ self.eaten1 -= front.as_ref().len();
self.queue.pop_front().unwrap();
}
}
}
+
+impl hyper::body::Buf for FrameQueueBuf {
+ fn remaining(&self) -> usize { self.queue.remaining() }
+ fn chunk(&self) -> &[u8] { self.queue.chunk() }
+ fn advance(&mut self, cnt: usize) { self.queue.advance(cnt) }
+}