@@ -78,21 +78,32 @@ impl FeltSizeCount {
78
78
}
79
79
}
80
80
81
- /// Counts felts in bytecode by size (small < 2^63, large >= 2^63).
81
+ // TODO(AvivG): use blake2s::SMALL_THRESHOLD.
82
+ const SMALL_THRESHOLD : Felt = Felt :: from_hex_unchecked ( "8000000000000000" ) ;
83
+
84
+
85
+ /// Counts elements into “small” vs “large” buckets using the provided predicate.
86
+ #[ inline]
87
+ fn count_felts_by_size < T > ( slice : & [ T ] , mut is_small : impl FnMut ( & T ) -> bool ) -> FeltSizeCount {
88
+ let mut small = 0 ;
89
+ let mut large = 0 ;
90
+ for it in slice {
91
+ if is_small ( it) { small += 1 } else { large += 1 }
92
+ }
93
+ FeltSizeCount { small, large }
94
+ }
95
+
96
+ /// Classifies bytecode words by felt size using `SMALL_THRESHOLD = 2^63`.
82
97
impl From < & [ BigUintAsHex ] > for FeltSizeCount {
83
98
fn from ( bytecode : & [ BigUintAsHex ] ) -> Self {
84
- // TODO(AvivG): use blake2s::SMALL_THRESHOLD.
85
- const SMALL_THRESHOLD : Felt = Felt :: from_hex_unchecked ( "8000000000000000" ) ;
86
-
87
- let ( small, large) = bytecode. iter ( ) . fold ( ( 0 , 0 ) , |( small_count, large_count) , x| {
88
- if Felt :: from ( & x. value ) < SMALL_THRESHOLD {
89
- ( small_count + 1 , large_count)
90
- } else {
91
- ( small_count, large_count + 1 )
92
- }
93
- } ) ;
99
+ count_felts_by_size ( bytecode, |x| Felt :: from ( & x. value ) < SMALL_THRESHOLD )
100
+ }
101
+ }
94
102
95
- FeltSizeCount { small, large }
103
+ /// Classifies felts by size using `SMALL_THRESHOLD = 2^63`.
104
+ impl From < & [ Felt ] > for FeltSizeCount {
105
+ fn from ( bytecode : & [ Felt ] ) -> Self {
106
+ count_felts_by_size ( bytecode, |felt| * felt < SMALL_THRESHOLD )
96
107
}
97
108
}
98
109
0 commit comments