chiark / gitweb /
genericise Queue
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 3 Aug 2021 23:26:10 +0000 (00:26 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Tue, 3 Aug 2021 23:31:22 +0000 (00:31 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/bin/client.rs
src/prelude.rs
src/queue.rs

index 8e2641483bfff919ecb7238b372ae7b8592aea1e..937d35f8ca6abca72d053624909d617fb9be8690 100644 (file)
@@ -193,7 +193,7 @@ async fn run_client<C:HCC>(
   let mut reqs: Vec<OutstandingRequest>
     = Vec::with_capacity(ic.max_requests_outstanding.sat());
 
-  let mut rx_queue: Queue = default();
+  let mut rx_queue: Queue<Box<[u8]>> = default();
 
   // xxx check that ic settings are all honoured
 
index 6fffe92fb97710b1786cf1dd4c04d44c972f7b7f..a133343af004e287e979d9788b858cf3f3d51743 100644 (file)
@@ -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};
index 21be105f86f7aeddf59fcceb5da7458e5aedab24..f821eb0c36111b8b8a92069d222b92642c116a30 100644 (file)
@@ -5,47 +5,47 @@
 use crate::prelude::*;
 
 #[derive(Default,Clone)]
-pub struct Queue {
+pub struct Queue<E> {
   content: usize,
   eaten1: usize, // 0 <= eaten1 < queue.front()...len()
-  queue: VecDeque<Box<[u8]>>,
+  queue: VecDeque<E>,
 }
 
-impl Debug for Queue {
+impl<E> Debug for Queue<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.len())?; }
+    for q in &self.queue { write!(f, "{},", q.as_ref().len())?; }
     write!(f, "]}}")?;
   }
 }
 
-impl Queue {
-  pub fn push<B: Into<Box<[u8]>>>(&mut self, b: B) {
+impl<E> Queue<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();
+  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<B> Extend<B> for Queue where B: Into<Box<[u8]>> {
+impl<E> Extend<E> for Queue<E> where E: AsRef<[u8]> {
   fn extend<I>(&mut self, it: I)
-  where I: IntoIterator<Item=B>
+  where I: IntoIterator<Item=E>
   {
     for b in it { self.push(b) }
   }
 }
 
-impl hyper::body::Buf for Queue {
+impl<E> hyper::body::Buf for Queue<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;
@@ -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();
     }
   }