chiark / gitweb /
server: route wip
[hippotat.git] / src / rope.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 pub 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     b.content += b;
22   }
23   pub fn is_empty(&self) { self.content == 0 }
24 }
25
26 impl bytes::Buf for Queue {
27   fn remaining(&self) -> usize { self.content }
28   fn chunk(&self) -> usize {
29     let front = if let(f) = self.queue.front() { f } else { return &[] };
30     front[ self.eaten1.. ]
31   }
32   fn advance(&self, cnt: usize) {
33     eaten1 += cnt;
34     loop {
35       if eaten1 == 0 { break }
36       let front = self.queue.front().unwrap();
37       if eaten1 < front.len() { break; }
38       eaten1 -= front.len();
39       self.queue.pop_front().unwrap();
40     }
41   }
42 }