1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
/*<LICENSE>
This file is part of Memthol.
Copyright (C) 2020 OCamlPro.
Memthol is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Memthol is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Memthol. If not, see <https://www.gnu.org/licenses/>.
*/
//! Statistics about filters.
//!
//! Used by the client to present stats to users.
prelude! {}
/// Filter statistics.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilterStats {
/// Number of allocation caught by the filter.
pub alloc_count: usize,
}
impl FilterStats {
/// Constructor.
pub fn new() -> Self {
Self { alloc_count: 0 }
}
/// Increments the number of allocations.
pub fn inc(&mut self) {
self.alloc_count += 1
}
}
/// Contains statistics for all filters.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AllFilterStats {
/// Map from filters to their statistics.
pub stats: BTMap<uid::Line, FilterStats>,
}
impl AllFilterStats {
/// Constructor.
pub fn new() -> Self {
Self {
stats: BTMap::new(),
}
}
/// Number of filters mentioned in the stats.
pub fn len(&self) -> usize {
self.stats.len()
}
/// Mutable accessor for a specific filter, inserts new stats if not there.
pub fn stats_mut(&mut self, filter: uid::Line) -> &mut FilterStats {
self.stats.entry(filter).or_insert_with(FilterStats::new)
}
/// Applies an action to a specific filter, inserts new stats if not there.
pub fn stats_do<T>(
&mut self,
filter: uid::Line,
action: impl FnOnce(&mut FilterStats) -> T,
) -> T {
action(self.stats_mut(filter))
}
/// Removes the stats for a filter.
pub fn remove(&mut self, filter: uid::Line) -> Option<FilterStats> {
self.stats.remove(&filter)
}
/// Retrieves the stats for a filter.
pub fn get(&self, filter: uid::Line) -> Option<&FilterStats> {
self.stats.get(&filter)
}
}