@@ -19,13 +19,15 @@ impl Serialize for Stats<'_> {
1919 where
2020 S : Serializer ,
2121 {
22- let mut st = serializer. serialize_struct ( "halstead" , 12 ) ?;
23- st. serialize_field ( "unique_operands " , & self . u_operands ( ) ) ?;
24- st. serialize_field ( "operands " , & self . operands ( ) ) ?;
25- st. serialize_field ( "unique_operators " , & self . u_operators ( ) ) ?;
26- st. serialize_field ( "operators " , & self . operators ( ) ) ?;
22+ let mut st = serializer. serialize_struct ( "halstead" , 14 ) ?;
23+ st. serialize_field ( "n1 " , & self . u_operators ( ) ) ?;
24+ st. serialize_field ( "N1 " , & self . operators ( ) ) ?;
25+ st. serialize_field ( "n2 " , & self . u_operands ( ) ) ?;
26+ st. serialize_field ( "N2 " , & self . operands ( ) ) ?;
2727 st. serialize_field ( "length" , & self . length ( ) ) ?;
28- st. serialize_field ( "size" , & self . size ( ) ) ?;
28+ st. serialize_field ( "estimated_program_length" , & self . estimated_program_length ( ) ) ?;
29+ st. serialize_field ( "purity_ratio" , & self . purity_ratio ( ) ) ?;
30+ st. serialize_field ( "vocabulary" , & self . vocabulary ( ) ) ?;
2931 st. serialize_field ( "volume" , & self . volume ( ) ) ?;
3032 st. serialize_field ( "difficulty" , & self . difficulty ( ) ) ?;
3133 st. serialize_field ( "level" , & self . level ( ) ) ?;
@@ -38,7 +40,37 @@ impl Serialize for Stats<'_> {
3840
3941impl < ' a > fmt:: Display for Stats < ' a > {
4042 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
41- write ! ( f, "unique operands: {}, operands: {}, unique operators: {}, operators: {}, length: {}, size: {}, volume: {}, difficulty: {}, level: {}, effort: {}, time: {}, bugs: {}" , self . u_operands( ) , self . operands( ) , self . u_operators( ) , self . operators( ) , self . length( ) , self . size( ) , self . volume( ) , self . difficulty( ) , self . level( ) , self . effort( ) , self . time( ) , self . bugs( ) )
43+ write ! (
44+ f,
45+ "n1: {}, \
46+ N1: {}, \
47+ n2: {}, \
48+ N2: {}, \
49+ length: {}, \
50+ estimated program length: {}, \
51+ purity ratio: {}, \
52+ size: {}, \
53+ volume: {}, \
54+ difficulty: {}, \
55+ level: {}, \
56+ effort: {}, \
57+ time: {}, \
58+ bugs: {}",
59+ self . u_operators( ) ,
60+ self . operators( ) ,
61+ self . u_operands( ) ,
62+ self . operands( ) ,
63+ self . length( ) ,
64+ self . estimated_program_length( ) ,
65+ self . purity_ratio( ) ,
66+ self . vocabulary( ) ,
67+ self . volume( ) ,
68+ self . difficulty( ) ,
69+ self . level( ) ,
70+ self . effort( ) ,
71+ self . time( ) ,
72+ self . bugs( ) ,
73+ )
4274 }
4375}
4476
@@ -78,13 +110,24 @@ impl<'a> Stats<'a> {
78110 }
79111
80112 #[ inline( always) ]
81- pub fn size ( & self ) -> f64 {
113+ pub fn estimated_program_length ( & self ) -> f64 {
114+ self . u_operators ( ) * self . u_operators ( ) . log2 ( )
115+ + self . u_operands ( ) * self . u_operands ( ) . log2 ( )
116+ }
117+
118+ #[ inline( always) ]
119+ pub fn purity_ratio ( & self ) -> f64 {
120+ self . estimated_program_length ( ) / self . length ( )
121+ }
122+
123+ #[ inline( always) ]
124+ pub fn vocabulary ( & self ) -> f64 {
82125 self . u_operands ( ) + self . u_operators ( )
83126 }
84127
85128 #[ inline( always) ]
86129 pub fn volume ( & self ) -> f64 {
87- self . length ( ) * self . size ( ) . log2 ( )
130+ self . length ( ) * self . vocabulary ( ) . log2 ( )
88131 }
89132
90133 #[ inline( always) ]
@@ -268,7 +311,7 @@ impl Halstead for RustCode {
268311 | LT | GT | AMP | MutableSpecifier | DOTDOT | DOTDOTEQ | DASH | AMPAMP | PIPEPIPE
269312 | PIPE | CARET | EQEQ | BANGEQ | LTEQ | GTEQ | LTLT | GTGT | SLASH | PERCENT
270313 | PLUSEQ | DASHEQ | STAREQ | SLASHEQ | PERCENTEQ | AMPEQ | PIPEEQ | CARETEQ
271- | LTLTEQ | GTGTEQ | Move | DOT => {
314+ | LTLTEQ | GTGTEQ | Move | DOT | PrimitiveType => {
272315 * stats. operators . entry ( id) . or_insert ( 0 ) += 1 ;
273316 }
274317 Identifier | StringLiteral | RawStringLiteral | IntegerLiteral | FloatLiteral
@@ -287,16 +330,17 @@ impl Halstead for CppCode {
287330 let id = node. kind_id ( ) ;
288331
289332 match id. into ( ) {
290- DOT | LPAREN | COMMA | STAR | GTGT | COLON | Return | Break | Continue | If | Else
291- | Switch | Case | Default | For | While | Goto | Do | Delete | New | Try | Catch
292- | Throw | EQ | AMPAMP | PIPEPIPE | PLUS | PLUSPLUS | SLASH | PERCENT | PIPE | AMP
293- | LTLT | TILDE | LT | LTEQ | EQEQ | BANGEQ | GTEQ | GT | PLUSEQ | BANG | STAREQ
294- | SLASHEQ | PERCENTEQ | GTGTEQ | LTLTEQ | AMPEQ | CARET | CARETEQ | PIPEEQ | LBRACK
295- | LBRACE | QMARK | COLONCOLON | TypeSpecifier | Sizeof => {
333+ DOT | LPAREN | LPAREN2 | COMMA | STAR | GTGT | COLON | SEMI | Return | Break
334+ | Continue | If | Else | Switch | Case | Default | For | While | Goto | Do | Delete
335+ | New | Try | Catch | Throw | EQ | AMPAMP | PIPEPIPE | DASH | PLUS | PLUSPLUS
336+ | SLASH | PERCENT | PIPE | AMP | LTLT | TILDE | LT | LTEQ | EQEQ | BANGEQ | GTEQ
337+ | GT | PLUSEQ | BANG | STAREQ | SLASHEQ | PERCENTEQ | GTGTEQ | LTLTEQ | AMPEQ
338+ | CARET | CARETEQ | PIPEEQ | LBRACK | LBRACE | QMARK | COLONCOLON | PrimitiveType
339+ | TypeSpecifier | Sizeof => {
296340 * stats. operators . entry ( id) . or_insert ( 0 ) += 1 ;
297341 }
298- Identifier | TypeIdentifier | FieldIdentifier | PrimitiveType | RawStringLiteral
299- | StringLiteral | NumberLiteral | True | False | Null | Nullptr | DOTDOTDOT => {
342+ Identifier | TypeIdentifier | FieldIdentifier | RawStringLiteral | StringLiteral
343+ | NumberLiteral | True | False | Null | Nullptr | DOTDOTDOT => {
300344 * stats. operands . entry ( get_id ( node, code) ) . or_insert ( 0 ) += 1 ;
301345 }
302346 _ => { }
0 commit comments