roaring/bitmap/statistics.rs
1use core::mem;
2
3use crate::bitmap::container::Container;
4use crate::RoaringBitmap;
5
6use super::store::Store;
7
8/// Detailed statistics on the composition of a bitmap.
9#[derive(Clone, Copy, PartialEq, Debug)]
10#[non_exhaustive]
11pub struct Statistics {
12 /// Number of containers in the bitmap
13 pub n_containers: u32,
14 /// Number of array containers in the bitmap
15 pub n_array_containers: u32,
16 /// Number of run containers in the bitmap
17 pub n_run_containers: u32,
18 /// Number of bitset containers in the bitmap
19 pub n_bitset_containers: u32,
20 /// Number of values stored in array containers
21 pub n_values_array_containers: u32,
22 /// Number of values stored in run containers
23 pub n_values_run_containers: u32,
24 /// Number of values stored in bitset containers
25 pub n_values_bitset_containers: u64,
26 /// Number of bytes used by array containers
27 pub n_bytes_array_containers: u64,
28 /// Number of bytes used by run containers
29 pub n_bytes_run_containers: u64,
30 /// Number of bytes used by bitset containers
31 pub n_bytes_bitset_containers: u64,
32 /// Maximum value stored in the bitmap
33 pub max_value: Option<u32>,
34 /// Minimum value stored in the bitmap
35 pub min_value: Option<u32>,
36 /// Number of values stored in the bitmap
37 pub cardinality: u64,
38}
39
40impl RoaringBitmap {
41 /// Returns statistics about the composition of a roaring bitmap.
42 ///
43 /// ```
44 /// use roaring::RoaringBitmap;
45 ///
46 /// let mut bitmap: RoaringBitmap = (1..100).collect();
47 /// let statistics = bitmap.statistics();
48 ///
49 /// assert_eq!(statistics.n_containers, 1);
50 /// assert_eq!(statistics.n_array_containers, 1);
51 /// assert_eq!(statistics.n_run_containers, 0);
52 /// assert_eq!(statistics.n_bitset_containers, 0);
53 /// assert_eq!(statistics.n_values_array_containers, 99);
54 /// assert_eq!(statistics.n_values_run_containers, 0);
55 /// assert_eq!(statistics.n_values_bitset_containers, 0);
56 /// assert_eq!(statistics.n_bytes_array_containers, 512);
57 /// assert_eq!(statistics.n_bytes_run_containers, 0);
58 /// assert_eq!(statistics.n_bytes_bitset_containers, 0);
59 /// assert_eq!(statistics.max_value, Some(99));
60 /// assert_eq!(statistics.min_value, Some(1));
61 /// assert_eq!(statistics.cardinality, 99);
62 /// ```
63 pub fn statistics(&self) -> Statistics {
64 let mut n_containers = 0;
65 let mut n_array_containers = 0;
66 let mut n_bitset_containers = 0;
67 let mut n_values_array_containers = 0;
68 let mut n_values_bitset_containers = 0;
69 let mut n_bytes_array_containers = 0;
70 let mut n_bytes_bitset_containers = 0;
71 let mut cardinality = 0;
72
73 for Container { key: _, store } in &self.containers {
74 match store {
75 Store::Array(array) => {
76 cardinality += array.len();
77 n_values_array_containers += array.len() as u32;
78 n_bytes_array_containers += (array.capacity() * mem::size_of::<u32>()) as u64;
79 n_array_containers += 1;
80 }
81 Store::Bitmap(bitmap) => {
82 cardinality += bitmap.len();
83 n_values_bitset_containers += bitmap.len();
84 n_bytes_bitset_containers += bitmap.capacity() as u64;
85 n_bitset_containers += 1;
86 }
87 }
88 n_containers += 1;
89 }
90
91 Statistics {
92 n_containers,
93 n_array_containers,
94 n_run_containers: 0,
95 n_bitset_containers,
96 n_values_array_containers,
97 n_values_run_containers: 0,
98 n_values_bitset_containers,
99 n_bytes_array_containers,
100 n_bytes_run_containers: 0,
101 n_bytes_bitset_containers,
102 max_value: self.max(),
103 min_value: self.min(),
104 cardinality,
105 }
106 }
107}