use std::collections::VecDeque;
#[derive(Debug, Default)]
pub struct SendBuffer {
data: VecDeque<u8>,
max_size: usize,
}
impl SendBuffer {
#[must_use]
pub fn new(max_size: usize) -> Self {
Self {
data: VecDeque::new(),
max_size,
}
}
pub fn push(&mut self, data: &[u8]) -> usize {
let available = self.max_size.saturating_sub(self.data.len());
let to_push = data.len().min(available);
self.data.extend(&data[..to_push]);
data.len() - to_push
}
pub fn pop(&mut self, max_size: usize) -> Vec<u8> {
let size = self.data.len().min(max_size);
self.data.drain(..size).collect()
}
#[must_use]
pub fn len(&self) -> usize {
self.data.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
#[must_use]
pub fn remaining(&self) -> usize {
self.max_size.saturating_sub(self.data.len())
}
pub fn clear(&mut self) {
self.data.clear();
}
}
#[derive(Debug, Default)]
pub struct RecvBuffer {
data: VecDeque<u8>,
max_size: usize,
}
impl RecvBuffer {
#[must_use]
pub fn new(max_size: usize) -> Self {
Self {
data: VecDeque::new(),
max_size,
}
}
pub fn push(&mut self, data: &[u8]) -> bool {
if self.data.len() + data.len() > self.max_size {
return false;
}
self.data.extend(data);
true
}
pub fn pop(&mut self, max_size: usize) -> Vec<u8> {
let size = self.data.len().min(max_size);
self.data.drain(..size).collect()
}
pub fn take(&mut self) -> Vec<u8> {
std::mem::take(&mut self.data).into()
}
#[must_use]
pub fn len(&self) -> usize {
self.data.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.data.is_empty()
}
#[must_use]
pub fn remaining(&self) -> usize {
self.max_size.saturating_sub(self.data.len())
}
pub fn clear(&mut self) {
self.data.clear();
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_send_buffer_push_pop() {
let mut buf = SendBuffer::new(100);
let remaining = buf.push(b"hello");
assert_eq!(remaining, 0);
assert_eq!(buf.len(), 5);
let data = buf.pop(3);
assert_eq!(data, b"hel");
assert_eq!(buf.len(), 2);
}
#[test]
fn test_send_buffer_overflow() {
let mut buf = SendBuffer::new(10);
let remaining = buf.push(b"hello world!");
assert_eq!(remaining, 2); assert_eq!(buf.len(), 10);
}
#[test]
fn test_recv_buffer_push_pop() {
let mut buf = RecvBuffer::new(100);
assert!(buf.push(b"hello"));
assert_eq!(buf.len(), 5);
let data = buf.take();
assert_eq!(data, b"hello");
assert!(buf.is_empty());
}
#[test]
fn test_recv_buffer_overflow() {
let mut buf = RecvBuffer::new(10);
assert!(buf.push(b"hello"));
assert!(!buf.push(b"world!"));
assert_eq!(buf.len(), 5);
}
}