#[non_exhaustive]pub struct Stats { /* private fields */ }Expand description
The ABC metric.
The ABC metric measures the size of a source code by counting
the number of Assignments (A), Branches (B) and Conditions (C).
The metric defines an ABC score as a vector of three elements (<A,B,C>).
The ABC score can be represented by its individual components (A, B and C)
or by the magnitude of the vector (|<A,B,C>| = sqrt(A^2 + B^2 + C^2)).
Official paper and definition:
Fitzpatrick, Jerry (1997). “Applying the ABC metric to C, C++ and Java”. C++ Report.
https://www.softwarerenovation.com/Articles.aspx
§Cross-language && / || policy
Per Fitzpatrick’s conditional-operator rule (Rule 5 in Figure 2
for C and Figure 4 for Java; Rule 7 in Figure 3 for C++), only
comparison operators (==, !=, <=, >=, <, >) and a
paper-defined keyword set (else, case, default, ?, plus
try / catch for C++ and Java) contribute to the condition
count. Per-language impl Abc blocks narrow this set where
appropriate — e.g., C++/Rust/Go/Python exclude default since
it falls through unconditionally (matching the Rust _ => and
Java default: precedent). The short-
circuit logical operators && and || (and per-language
equivalents — Python’s and / or, Lua’s and / or, Tcl’s
&& / ||, Perl’s && / || / // / and / or / xor)
are deliberately not counted on their own. The paper’s
worked Listing 2 annotates (am >= 0 && am <= 0xF) ? '/' : 'C'
as accc — three conditions for >=, <=, ?, zero for
&&.
Fitzpatrick’s Rule 7 (Figure 3, C++) / Rule 9 (Figure 4, Java) —
“Add one to the condition count for each unary conditional
expression” — instead counts each non-comparison operand of a
&& / || chain once. The paper’s worked example for this
rule is if (x || y) printf("test failure\n");, annotated:
“there are two unary conditions since both x and y are
tested as conditional expressions” (so || contributes zero,
x contributes one, y contributes one, and printf(...)
contributes one branch). The walker machinery for this —
modelled on java_count_unary_conditions /
java_inspect_container — is present today for Java, Groovy,
C#, Rust, Go, JavaScript, TypeScript, TSX, Mozjs, PHP, C++,
Python, Perl, Lua, Tcl, iRules, Kotlin, Ruby, and Elixir. So
if (a && b) reports 2 conditions across this set, matching
the paper. Bash is the lone exception: its && / || are
command-list separators rather than boolean-expression operands
with named leaf operands, so Fitzpatrick’s Rule 9 does not map
onto its grammar and the walker is deliberately not wired.
This policy is paper-faithful and deviates from RuboCop’s
Metrics/AbcSize (which counts and / or as conditions
directly) while matching StepicOrg/abcmeter and
eoinnoble/python-abc. The book’s ABC counting rules
section reproduces the rule tables, a per-language deviation
table, and worked examples — see the chapter at
https://dekobon.github.io/big-code-analysis/metrics.html#abc.
See issue #395 for the Phase-1 cross-language policy alignment, #403 for the Phase-2 unary-conditional walker fan-out, #404 for the Phase-3 book documentation, and #557 for the Kotlin / Ruby / Elixir walker wiring.
Implementations§
Source§impl Stats
impl Stats
Sourcepub fn assignments(&self) -> u64
pub fn assignments(&self) -> u64
Returns the Abc assignments metric value.
Sourcepub fn assignments_sum(&self) -> u64
pub fn assignments_sum(&self) -> u64
Returns the Abc assignments sum metric value.
Sourcepub fn assignments_average(&self) -> f64
pub fn assignments_average(&self) -> f64
Returns the Abc assignments average value.
This value is computed dividing the Abc
assignments value for the number of spaces.
Sourcepub fn assignments_min(&self) -> u64
pub fn assignments_min(&self) -> u64
Returns the Abc assignments minimum value.
Collapses the f64::MAX sentinel that Stats::default() plants
into assignments_min to 0, so a never-observed space
serializes to a meaningful number rather than 1.7976931e308.
Sourcepub fn assignments_max(&self) -> u64
pub fn assignments_max(&self) -> u64
Returns the Abc assignments maximum value.
Sourcepub fn branches_sum(&self) -> u64
pub fn branches_sum(&self) -> u64
Returns the Abc branches sum metric value.
Sourcepub fn branches_average(&self) -> f64
pub fn branches_average(&self) -> f64
Returns the Abc branches average value.
This value is computed dividing the Abc
branches value for the number of spaces.
Sourcepub fn branches_min(&self) -> u64
pub fn branches_min(&self) -> u64
Returns the Abc branches minimum value.
Same f64::MAX sentinel collapse as assignments_min.
Sourcepub fn branches_max(&self) -> u64
pub fn branches_max(&self) -> u64
Returns the Abc branches maximum value.
Sourcepub fn conditions(&self) -> u64
pub fn conditions(&self) -> u64
Returns the Abc conditions metric value.
Sourcepub fn conditions_sum(&self) -> u64
pub fn conditions_sum(&self) -> u64
Returns the Abc conditions sum metric value.
Sourcepub fn conditions_average(&self) -> f64
pub fn conditions_average(&self) -> f64
Returns the Abc conditions average value.
This value is computed dividing the Abc
conditions value for the number of spaces.
Sourcepub fn conditions_min(&self) -> u64
pub fn conditions_min(&self) -> u64
Returns the Abc conditions minimum value.
Same f64::MAX sentinel collapse as assignments_min.
Sourcepub fn conditions_max(&self) -> u64
pub fn conditions_max(&self) -> u64
Returns the Abc conditions maximum value.
Sourcepub fn magnitude_sum(&self) -> f64
pub fn magnitude_sum(&self) -> f64
Returns the Abc magnitude sum metric value.