chiark / gitweb /
provide queue
[hippotat.git] / src / queue.rs
1 // Copyright 2021 Ian Jackson and contributors to Hippotat
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 // There is NO WARRANTY.
4
5 use crate::prelude::*;
6
7 #[derive(Default,Clone)]
8 pub struct Queue {
9   content: usize,
10   eaten1: usize, // 0 <= eaten1 < queue.front()...len()
11   queue: VecDeque<Box<[u8]>>,
12 }
13
14 impl Queue {
15   pub fn push<B: Into<Box<[u8]>>>(&mut self, b: B) {
16     self.push_(b.into());
17   }
18   pub fn push_(&mut self, b: Box<[u8]>) {
19     let l = b.len();
20     self.push(b);
21     self.content += l;
22   }
23   pub fn is_empty(&self) -> bool { self.content == 0 }
24 }
25
26 impl hyper::body::Buf for Queue {
27   fn remaining(&self) -> usize { self.content }
28   fn chunk(&self) -> &[u8] {
29     let front = if let Some(f) = self.queue.front() { f } else { return &[] };
30     &front[ self.eaten1.. ]
31   }
32   fn advance(&mut self, cnt: usize) {
33     self.content -= cnt;
34     self.eaten1 += cnt;
35     loop {
36       if self.eaten1 == 0 { break }
37       let front = self.queue.front().unwrap();
38       if self.eaten1 < front.len() { break; }
39       self.eaten1 -= front.len();
40       self.queue.pop_front().unwrap();
41     }
42   }
43 }