1use crate::{len::LengthType, mem::SpareMemoryPolicy, smallvec::SmallVec};
2use core::ptr;
3
4pub struct RetainGuard<'a, T, const C: usize, L, SM>
5where
6 L: LengthType,
7 SM: SpareMemoryPolicy<T>,
8 T: 'a,
9{
10 pub(super) sv: &'a mut SmallVec<T, C, L, SM>,
11 pub(super) len: usize,
12 pub(super) processed: usize,
13 pub(super) deleted: usize,
14}
15
16impl<'a, T, L, SM, const C: usize> Drop for RetainGuard<'a, T, C, L, SM>
17where
18 L: LengthType,
19 SM: SpareMemoryPolicy<T>,
20 T: 'a,
21{
22 fn drop(&mut self) {
23 debug_assert!(self.deleted <= self.processed);
24 debug_assert!(self.processed <= self.len);
25
26 let new_len = self.len - self.deleted;
27
28 unsafe {
31 if self.deleted > 0 {
32 ptr::copy(
33 self.sv.as_ptr().add(self.processed),
34 self.sv.as_mut_ptr().add(self.processed - self.deleted),
35 self.len - self.processed,
36 );
37
38 SM::init(self.sv.as_mut_ptr().add(new_len), self.deleted)
39 }
40 self.sv.set_len(new_len);
41 }
42 }
43}