From: Ian Jackson Date: Tue, 3 Aug 2021 23:26:10 +0000 (+0100) Subject: genericise Queue X-Git-Tag: hippotat/1.0.0~363 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=772514086f7e9fa46221c2f673b2c95b034e7222;p=hippotat.git genericise Queue Signed-off-by: Ian Jackson --- diff --git a/src/bin/client.rs b/src/bin/client.rs index 8e26414..937d35f 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -193,7 +193,7 @@ async fn run_client( let mut reqs: Vec = Vec::with_capacity(ic.max_requests_outstanding.sat()); - let mut rx_queue: Queue = default(); + let mut rx_queue: Queue> = default(); // xxx check that ic settings are all honoured diff --git a/src/prelude.rs b/src/prelude.rs index 6fffe92..a133343 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -24,6 +24,7 @@ pub use std::task::Poll; pub use std::time::{SystemTime, UNIX_EPOCH}; pub use anyhow::{anyhow, Context}; +pub use cervine::Cow as Cervine; pub use extend::ext; pub use fehler::{throw, throws}; pub use futures::{poll, future}; diff --git a/src/queue.rs b/src/queue.rs index 21be105..f821eb0 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -5,47 +5,47 @@ use crate::prelude::*; #[derive(Default,Clone)] -pub struct Queue { +pub struct Queue { content: usize, eaten1: usize, // 0 <= eaten1 < queue.front()...len() - queue: VecDeque>, + queue: VecDeque, } -impl Debug for Queue { +impl Debug for Queue 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.len())?; } + for q in &self.queue { write!(f, "{},", q.as_ref().len())?; } write!(f, "]}}")?; } } -impl Queue { - pub fn push>>(&mut self, b: B) { +impl Queue where E: AsRef<[u8]> { + pub fn push>(&mut self, b: B) { self.push_(b.into()); } - pub fn push_(&mut self, b: Box<[u8]>) { - let l = b.len(); + 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 Extend for Queue where B: Into> { +impl Extend for Queue where E: AsRef<[u8]> { fn extend(&mut self, it: I) - where I: IntoIterator + where I: IntoIterator { for b in it { self.push(b) } } } -impl hyper::body::Buf for Queue { +impl hyper::body::Buf for Queue 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; @@ -53,8 +53,8 @@ impl hyper::body::Buf for Queue { 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(); } }