Skip to main content

get_size2/impls/feature/
orx_concurrent_vec.rs

1use orx_concurrent_vec::{ConcurrentElement, ConcurrentVec, IntoConcurrentPinnedVec};
2
3use crate::{GetSize, GetSizeTracker};
4
5// `ConcurrentVec::new()` eagerly allocates an initial fragment, so
6// `capacity()` is nonzero even for an empty vec. Backing `SplitVec`
7// fragment headers are not counted (bounded by a small constant for
8// the default Doubling growth strategy).
9
10impl<T, P> GetSize for ConcurrentVec<T, P>
11where
12    T: GetSize,
13    P: IntoConcurrentPinnedVec<ConcurrentElement<T>>,
14{
15    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
16        let (heap, tracker) = self.iter().fold((0usize, tracker), |(size, tr), elem| {
17            let (elem_size, tr) = elem.map(|t: &T| T::get_heap_size_with_tracker(t, tr));
18            (size + elem_size, tr)
19        });
20        let allocation = self.capacity() * core::mem::size_of::<ConcurrentElement<T>>();
21        (heap + allocation, tracker)
22    }
23}