orx_split_vec/
into_concurrent_pinned_vec.rs

1use crate::{ConcurrentSplitVec, GrowthWithConstantTimeAccess, SplitVec};
2use orx_pinned_vec::IntoConcurrentPinnedVec;
3
4impl<T, G: GrowthWithConstantTimeAccess> IntoConcurrentPinnedVec<T> for SplitVec<T, G> {
5    type ConPinnedVec = ConcurrentSplitVec<T, G>;
6
7    fn into_concurrent(self) -> Self::ConPinnedVec {
8        self.into()
9    }
10
11    fn into_concurrent_filled_with<F>(mut self, fill_with: F) -> Self::ConPinnedVec
12    where
13        F: Fn() -> T,
14    {
15        if let Some(fragment) = self.fragments.last_mut() {
16            let (len, capacity) = (fragment.len(), fragment.capacity());
17            let num_additional = capacity - len;
18            for _ in 0..num_additional {
19                fragment.push(fill_with());
20            }
21
22            self.len += num_additional;
23
24            debug_assert_eq!(
25                self.len,
26                self.fragments.iter().map(|x| x.len()).sum::<usize>()
27            );
28        }
29
30        self.into()
31    }
32}