capability_feature_measurement/
level_specific_stats.rs

1// ---------------- [ File: capability-feature-measurement/src/level_specific_stats.rs ]
2crate::ix!();
3
4/// ---------------------------------------------------------------------------
5/// 4) Level-Specific Stats (e.g., Overridden Breadth / Density Per Level)
6/// ---------------------------------------------------------------------------
7
8/// Provides an aggregated view of how many nodes, children, and leaves appear at each level of the tree.
9pub trait TreeLevelSpecificMeasurer {
10    /// Returns a map: level => aggregate stats (node count, child sum, leaf sum, etc.).
11    fn measure_tree_level_stats(&self) -> HashMap<u8, TreeLevelAggregate>;
12}
13
14/// A helper struct summarizing counts at a single level in the tree.
15/// No public fields, so we use getset to provide read-only access.
16#[derive(Debug, Clone, PartialEq, derive_builder::Builder, getset::Getters)]
17#[builder(pattern = "owned", setter(into), build_fn(skip))]
18pub struct TreeLevelAggregate {
19    #[getset(get = "pub")]
20    #[builder(default)]
21    total_node_count: u64,
22
23    #[getset(get = "pub")]
24    #[builder(default)]
25    total_child_count: u64,
26
27    #[getset(get = "pub")]
28    #[builder(default)]
29    total_leaf_count: u64,
30}
31
32impl Default for TreeLevelAggregate {
33    fn default() -> Self {
34        Self {
35            total_node_count: 0,
36            total_child_count: 0,
37            total_leaf_count: 0,
38        }
39    }
40}
41
42impl TreeLevelAggregateBuilder {
43    pub fn build(&self) -> Result<TreeLevelAggregate, derive_builder::UninitializedFieldError> {
44        let agg = TreeLevelAggregate {
45            total_node_count: self.total_node_count.unwrap_or_default(),
46            total_child_count: self.total_child_count.unwrap_or_default(),
47            total_leaf_count: self.total_leaf_count.unwrap_or_default(),
48        };
49        Ok(agg)
50    }
51}