1extern crate alloc;
2use crate::{RandPusher, SeqPusher};
3use alloc::{sync::Arc, vec::Vec};
4use spin::mutex::SpinMutex;
5
6#[derive(Debug, Default, Clone)]
7pub struct MemPusher {
8 pub receive: Arc<SpinMutex<Vec<u8>>>,
9}
10impl MemPusher {
11 pub fn new() -> Self {
12 Self {
13 receive: Arc::new(SpinMutex::new(Vec::new())),
14 }
15 }
16 pub fn with_capacity(capacity: usize) -> Self {
17 Self {
18 receive: Arc::new(SpinMutex::new(Vec::with_capacity(capacity))),
19 }
20 }
21}
22impl SeqPusher for MemPusher {
23 type Error = ();
24 async fn push(&mut self, content: &[u8]) -> Result<(), Self::Error> {
25 self.receive.lock().extend_from_slice(content);
26 Ok(())
27 }
28}
29impl RandPusher for MemPusher {
30 type Error = ();
31 async fn push(
32 &mut self,
33 range: crate::ProgressEntry,
34 content: &[u8],
35 ) -> Result<(), Self::Error> {
36 let mut guard = self.receive.lock();
37 if range.start as usize == guard.len() {
38 guard.extend_from_slice(content);
39 } else {
40 if guard.len() < range.end as usize {
41 guard.resize(range.end as usize, 0);
42 }
43 guard[range.start as usize..range.end as usize].copy_from_slice(content);
44 }
45 Ok(())
46 }
47}