cds/smallvec/
retain.rs

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        // move the unprocessed elements to preserve small-vector's contiguity.
29        // Set the correct length, and invoke spare memory policy if needed.
30        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}