Skip to main content

get_size2/impls/feature/
roaring.rs

1use crate::{GetSize, GetSizeTracker};
2
3// Container allocations live in a private `Vec<Container>`; `statistics()`
4// is the only public proxy for their byte totals. Per-container key/tag
5// fields and the outer `Vec<Container>` slots are not counted — bounded
6// by 65 536 containers per bitmap, negligible vs. up to ~512 MiB of
7// container payload.
8
9impl GetSize for roaring::RoaringBitmap {
10    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
11        let s = self.statistics();
12        let bytes =
13            s.n_bytes_array_containers + s.n_bytes_bitset_containers + s.n_bytes_run_containers;
14        // u64 → usize: bounded ~512 MiB so fits everywhere; saturate
15        // defensively in release, surface the invariant breach in debug.
16        debug_assert!(bytes <= usize::MAX as u64);
17        (usize::try_from(bytes).unwrap_or(usize::MAX), tracker)
18    }
19}
20
21// Mirrors the `BTreeMap<K, V>` impl in `collections.rs` — per-entry
22// stack + heap of both K and V, no node-padding accounting.
23
24impl GetSize for roaring::RoaringTreemap {
25    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
26        self.bitmaps()
27            .fold((0, tracker), |(size, tracker), (key, bitmap)| {
28                let (key_size, tracker) = u32::get_size_with_tracker(&key, tracker);
29                let (bm_size, tracker) =
30                    roaring::RoaringBitmap::get_size_with_tracker(bitmap, tracker);
31                (size + key_size + bm_size, tracker)
32            })
33    }
34}