copy_stack_vec/vec/array/
extend.rs1use crate::{error::Error, vec::CopyStackVec};
6
7impl<T: Copy, const N: usize> Extend<T> for CopyStackVec<T, N> {
8 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
9 let remaining = N - self.len;
10 if remaining == 0 {
11 return;
12 }
13
14 for item in iter.into_iter().take(remaining) {
15 self.buf[self.len] = item;
16 self.len += 1;
17 }
18 }
19}
20
21impl<T: Copy, const N: usize> CopyStackVec<T, N> {
22 #[inline]
24 pub fn extend_from_slice(&mut self, src: &[T]) -> Result<(), Error> {
25 let avail = N - self.len;
26 if src.len() > avail {
27 return Err(Error::Full);
28 }
29 let len = self.len;
30 self.buf[len..len + src.len()].copy_from_slice(src);
31 self.len = len + src.len();
32 Ok(())
33 }
34
35 #[inline]
37 #[must_use]
38 pub fn extend_from_slice_truncated(&mut self, src: &[T]) -> usize {
39 let len = self.len;
40 let avail = N - len;
41 let take = avail.min(src.len());
42 self.buf[len..len + take].copy_from_slice(&src[..take]);
43 self.len = len + take;
44 take
45 }
46}
47
48impl<T: Copy + Default, const N: usize> CopyStackVec<T, N> {
49 #[inline]
60 pub fn try_extend_from_iter<I: IntoIterator<Item = T>>(
61 &mut self,
62 iter: I,
63 ) -> Result<(), Error> {
64 let spare = N - self.len;
65
66 let mut tmp: CopyStackVec<T, N> = CopyStackVec::default();
68 for item in iter {
69 if tmp.len() == spare {
70 return Err(Error::Full);
71 }
72 tmp.push(item)?;
75 }
76
77 self.extend_from_slice(tmp.as_slice())
79 }
80}