layer_crypto/
deque_buffer.rs1use std::ops::{Index, IndexMut};
22use std::slice::SliceIndex;
23
24#[derive(Clone, Debug)]
26pub struct DequeBuffer {
27 buf: Vec<u8>,
28 head: usize,
29 default_head: usize,
30}
31
32impl DequeBuffer {
33 pub fn with_capacity(back: usize, front: usize) -> Self {
35 let mut buf = Vec::with_capacity(front + back);
36 buf.resize(front, 0);
37 Self {
38 buf,
39 head: front,
40 default_head: front,
41 }
42 }
43
44 pub fn clear(&mut self) {
46 self.buf.truncate(self.default_head);
47 self.buf[..self.head].fill(0);
48 self.head = self.default_head;
49 }
50
51 pub fn extend_front(&mut self, slice: &[u8]) {
53 if self.head >= slice.len() {
54 self.head -= slice.len();
55 } else {
56 let shift = slice.len() - self.head;
57 self.buf.extend(std::iter::repeat_n(0, shift));
58 self.buf.rotate_right(shift);
59 self.head = 0;
60 }
61 self.buf[self.head..self.head + slice.len()].copy_from_slice(slice);
62 }
63
64 pub fn len(&self) -> usize {
66 self.buf.len() - self.head
67 }
68
69 pub fn is_empty(&self) -> bool {
71 self.head == self.buf.len()
72 }
73}
74
75impl AsRef<[u8]> for DequeBuffer {
76 fn as_ref(&self) -> &[u8] {
77 &self.buf[self.head..]
78 }
79}
80impl AsMut<[u8]> for DequeBuffer {
81 fn as_mut(&mut self) -> &mut [u8] {
82 &mut self.buf[self.head..]
83 }
84}
85impl<I: SliceIndex<[u8]>> Index<I> for DequeBuffer {
86 type Output = I::Output;
87 fn index(&self, i: I) -> &Self::Output {
88 self.as_ref().index(i)
89 }
90}
91impl<I: SliceIndex<[u8]>> IndexMut<I> for DequeBuffer {
92 fn index_mut(&mut self, i: I) -> &mut Self::Output {
93 self.as_mut().index_mut(i)
94 }
95}
96impl Extend<u8> for DequeBuffer {
97 fn extend<T: IntoIterator<Item = u8>>(&mut self, iter: T) {
98 self.buf.extend(iter);
99 }
100}
101impl<'a> Extend<&'a u8> for DequeBuffer {
102 fn extend<T: IntoIterator<Item = &'a u8>>(&mut self, iter: T) {
103 self.buf.extend(iter);
104 }
105}