use std::collections::VecDeque;
use std::mem;
use bytes::Buf;
use crate::*;
#[derive(Clone, Default)]
pub struct QueueBuf(VecDeque<Buffer>);
impl QueueBuf {
#[inline]
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn push(&mut self, buf: Buffer) {
if buf.is_empty() {
return;
}
self.0.push_back(buf);
}
#[inline]
pub fn len(&self) -> usize {
self.0.iter().map(|b| b.len()).sum()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
#[inline]
pub fn take(&mut self) -> QueueBuf {
mem::take(self)
}
#[inline]
pub fn collect(mut self) -> Buffer {
if self.0.is_empty() {
Buffer::new()
} else if self.0.len() == 1 {
self.0.pop_front().unwrap()
} else {
self.0.into_iter().flatten().collect()
}
}
#[inline]
pub fn advance(&mut self, cnt: usize) {
assert!(cnt <= self.len(), "cannot advance past {cnt} bytes");
let mut new_cnt = cnt;
while new_cnt > 0 {
let buf = self.0.front_mut().expect("buffer must be valid");
if new_cnt < buf.remaining() {
buf.advance(new_cnt);
break;
} else {
new_cnt -= buf.remaining();
self.0.pop_front();
}
}
}
#[inline]
pub fn clear(&mut self) {
self.0.clear()
}
}