ps_buffer/traits/
into_shared_buffer.rs

1use crate::{Buffer, BufferError, SharedBuffer};
2
3pub trait ByteIteratorIntoSharedBuffer {
4    /// Collects this [`Iterator`] into a [`SharedBuffer`].
5    /// # Errors
6    /// [`BufferError`] is returned if an allocation or reallocation fails.
7    fn into_shared_buffer(self) -> Result<SharedBuffer, BufferError>;
8}
9
10impl<T: Iterator<Item = u8>> ByteIteratorIntoSharedBuffer for T {
11    fn into_shared_buffer(self) -> Result<SharedBuffer, BufferError> {
12        let mut buffer = Buffer::with_capacity(self.size_hint().0)?;
13
14        for byte in self {
15            buffer.push(byte)?;
16        }
17
18        Ok(buffer.share())
19    }
20}
21
22pub trait ByteRefIteratorIntoSharedBuffer {
23    /// Collects this [`Iterator`] into a [`SharedBuffer`].
24    /// # Errors
25    /// [`BufferError`] is returned if an allocation or reallocation fails.
26    fn into_shared_buffer(self) -> Result<SharedBuffer, BufferError>;
27}
28
29impl<'lt, T: Iterator<Item = &'lt u8>> ByteRefIteratorIntoSharedBuffer for T {
30    fn into_shared_buffer(self) -> Result<SharedBuffer, BufferError> {
31        self.copied().into_shared_buffer()
32    }
33}
34
35pub trait ByteSliceIteratorIntoSharedBuffer {
36    /// Collects this [`Iterator`] into a [`SharedBuffer`].
37    /// # Errors
38    /// [`BufferError`] is returned if an allocation or reallocation fails.
39    fn into_shared_buffer(self) -> Result<SharedBuffer, BufferError>;
40}
41
42impl<Ts: AsRef<[u8]>, Ti: Iterator<Item = Ts>> ByteSliceIteratorIntoSharedBuffer for Ti {
43    fn into_shared_buffer(self) -> Result<SharedBuffer, BufferError> {
44        let mut buffer = Buffer::new();
45
46        for bytes in self {
47            buffer.extend_from_slice(bytes.as_ref())?;
48        }
49
50        Ok(buffer.share())
51    }
52}