1pub struct PushBuffer<T> {
4 data: Vec<T>,
5}
6
7impl<T> PushBuffer<T> {
8 pub fn new(capacity: usize) -> Self {
10 assert!(capacity > 0);
11 Self {
12 data: Vec::with_capacity(capacity),
13 }
14 }
15
16 pub fn len(&self) -> usize {
18 self.data.len()
19 }
20
21 pub fn is_empty(&self) -> bool {
23 self.data.len() == 0
24 }
25
26 pub fn capacity(&self) -> usize {
28 self.data.capacity()
29 }
30
31 pub fn start_pass(&mut self) -> PushBufferPass<'_, T> {
33 self.data.clear();
34 PushBufferPass::new(self)
35 }
36
37 pub fn data(&self) -> &[T] {
38 &self.data
39 }
40}
41
42pub struct PushBufferPass<'a, T> {
44 push_buffer: &'a mut PushBuffer<T>,
45}
46
47impl<'a, T> PushBufferPass<'a, T> {
48 pub fn new(push_buffer: &'a mut PushBuffer<T>) -> Self {
50 Self { push_buffer }
51 }
52
53 pub fn push(&mut self, element: T) {
55 self.push_buffer.data.push(element);
56 }
57}
58
59#[cfg(test)]
60mod tests {
61 use super::*;
62
63 #[test]
64 fn push_buffer_grows() {
65 let mut push_buffer = PushBuffer::<u32>::new(4);
66 assert_eq!(push_buffer.len(), 0);
67 assert_eq!(push_buffer.capacity(), 4);
68
69 {
70 let mut pass = push_buffer.start_pass();
71 for i in 0..8 {
72 pass.push(i + 1);
73 }
74 }
75
76 assert_eq!(push_buffer.len(), 8);
77 assert_eq!(push_buffer.data(), &(1..9).collect::<Vec<_>>());
78 assert!(push_buffer.capacity() >= 8);
79
80 {
81 let _pass = push_buffer.start_pass();
82 }
83
84 assert_eq!(push_buffer.len(), 0);
85 }
86}