fast_pull/mem/
pusher.rs

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}