swf_parser/
stream_buffer.rs

1/// Trait representing the buffer backing a streaming parser.
2///
3/// This trait provides a way to keep only the unparsed input in memory.
4pub trait StreamBuffer {
5  fn new() -> Self;
6
7  /// Add unparsed data at the end of the buffer.
8  fn write(&mut self, unparsed_bytes: &[u8]);
9
10  /// Get the unparsed data.
11  fn get(&self) -> &[u8];
12
13  /// Mark the provided count of bytes as _parsed_.
14  fn clear(&mut self, parsed_size: usize);
15}
16
17/// Stream buffer backed a `Vec<u8>`.
18pub struct FlatBuffer {
19  parsed: usize,
20  inner: Vec<u8>,
21}
22
23impl FlatBuffer {}
24
25impl StreamBuffer for FlatBuffer {
26  fn new() -> Self {
27    Self {
28      parsed: 0,
29      inner: Vec::new(),
30    }
31  }
32
33  fn write(&mut self, unparsed_bytes: &[u8]) {
34    self.inner.extend_from_slice(unparsed_bytes)
35  }
36
37  fn get(&self) -> &[u8] {
38    &self.inner[self.parsed..]
39  }
40
41  fn clear(&mut self, parsed_size: usize) {
42    self.parsed += parsed_size;
43  }
44}
45
46// TODO: Ring buffer backed by a `SliceDeque`?