benchmark_rs/
analysis_result.rs1use crate::benchmark_comparison::BenchmarkComparison;
2use serde::{Deserialize, Serialize};
3use std::{
4 collections::{HashMap, HashSet},
5 fmt::Display,
6};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct AnalysisResult {
11 name: String,
12 new_series: HashSet<String>,
13 equal_series: HashMap<String, HashMap<String, BenchmarkComparison>>,
14 divergent_series: HashMap<String, HashMap<String, BenchmarkComparison>>,
15}
16
17impl AnalysisResult {
18 pub(crate) fn new(name: String) -> AnalysisResult {
19 AnalysisResult {
20 name,
21 new_series: Default::default(),
22 equal_series: Default::default(),
23 divergent_series: Default::default(),
24 }
25 }
26
27 pub(crate) fn add_new(&mut self, name: String) {
28 self.new_series.insert(name);
29 }
30
31 pub(crate) fn add(&mut self, name: String, comparisons: HashMap<String, BenchmarkComparison>) {
32 let equal = comparisons
33 .iter()
34 .fold(
35 true,
36 |equal, (_, benchmark_comparison)| match benchmark_comparison {
37 BenchmarkComparison::Less { .. } => false,
38 BenchmarkComparison::Equal { .. } => equal,
39 BenchmarkComparison::Greater { .. } => false,
40 },
41 );
42 if equal {
43 self.equal_series.insert(name, comparisons);
44 } else {
45 self.divergent_series.insert(name, comparisons);
46 }
47 }
48
49 pub fn name(&self) -> &String {
51 &self.name
52 }
53
54 pub fn new_series(&self) -> &HashSet<String> {
56 &self.new_series
57 }
58
59 pub fn equal_series(&self) -> &HashMap<String, HashMap<String, BenchmarkComparison>> {
61 &self.equal_series
62 }
63
64 pub fn divergent_series(&self) -> &HashMap<String, HashMap<String, BenchmarkComparison>> {
66 &self.divergent_series
67 }
68
69 pub fn results(&self) -> &HashMap<String, HashMap<String, BenchmarkComparison>> {
71 self.divergent_series()
72 }
73}
74
75impl Display for AnalysisResult {
76 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77 write!(f, "{}", serde_json::to_string_pretty(&self).unwrap())
78 }
79}