Skip to content

Commit cb9c0c9

Browse files
committed
perf: removed many 1d stack allocations
1 parent af09544 commit cb9c0c9

File tree

9 files changed

+51
-60
lines changed

9 files changed

+51
-60
lines changed

src/oned/code_128_reader.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,15 +363,15 @@ impl Code128Reader {
363363
let mut counters = [0_u32; 6];
364364
let mut patternStart = rowOffset;
365365
let mut isWhite = false;
366-
let patternLength = counters.len();
366+
let patternLength = 6;
367367

368368
for i in rowOffset..width {
369369
if row.get(i) != isWhite {
370370
counters[counterPosition] += 1;
371371
} else {
372372
if counterPosition == patternLength - 1 {
373373
let mut bestVariance = MAX_AVG_VARIANCE;
374-
let mut bestMatch = -1_isize;
374+
let mut bestMatch = -1_i32;
375375
for startCode in CODE_START_A..=CODE_START_C {
376376
let variance = one_d_reader::pattern_match_variance(
377377
&counters,
@@ -380,7 +380,7 @@ impl Code128Reader {
380380
);
381381
if variance < bestVariance {
382382
bestVariance = variance;
383-
bestMatch = startCode as isize;
383+
bestMatch = startCode as i32;
384384
}
385385
}
386386
// Look for whitespace before start pattern, >= 50% of width of start pattern

src/oned/code_39_reader.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,17 @@ impl Code39Reader {
211211
}
212212
}
213213

214-
fn findAsteriskPattern(row: &BitArray, counters: &mut [u32]) -> Result<Vec<u32>> {
214+
fn findAsteriskPattern<const N: usize>(
215+
row: &BitArray,
216+
counters: &mut [u32; N],
217+
) -> Result<[u32; 2]> {
215218
let width = row.get_size();
216219
let rowOffset = row.getNextSet(0);
217220

218221
let mut counterPosition = 0;
219222
let mut patternStart = rowOffset;
220223
let mut isWhite = false;
221-
let patternLength = counters.len();
224+
let patternLength = N;
222225

223226
for i in rowOffset..width {
224227
// for (int i = rowOffset; i < width; i++) {
@@ -236,7 +239,7 @@ impl Code39Reader {
236239
false,
237240
)?
238241
{
239-
return Ok(vec![patternStart as u32, i as u32]);
242+
return Ok([patternStart as u32, i as u32]);
240243
// return new int[]{patternStart, i};
241244
}
242245
patternStart += (counters[0] + counters[1]) as usize;
@@ -258,8 +261,8 @@ impl Code39Reader {
258261

259262
// For efficiency, returns -1 on failure. Not throwing here saved as many as 700 exceptions
260263
// per image when using some of our blackbox images.
261-
fn toNarrowWidePattern(counters: &[u32]) -> i32 {
262-
let numCounters = counters.len();
264+
fn toNarrowWidePattern<const N: usize>(counters: &[u32; N]) -> i32 {
265+
let numCounters = N;
263266
let mut maxNarrowCounter = 0;
264267
let mut wideCounters;
265268
loop {

src/oned/code_93_reader.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ impl Code93Reader {
169169
let rowOffset = row.getNextSet(0);
170170

171171
self.counters.fill(0);
172-
let mut theCounters = self.counters;
172+
let theCounters = &mut self.counters;
173173
let mut patternStart = rowOffset;
174174
let mut isWhite = false;
175175
let patternLength = theCounters.len();
@@ -180,7 +180,7 @@ impl Code93Reader {
180180
theCounters[counterPosition] += 1;
181181
} else {
182182
if counterPosition == patternLength - 1 {
183-
if Self::toPattern(&theCounters) == Self::ASTERISK_ENCODING {
183+
if Self::toPattern(theCounters) == Self::ASTERISK_ENCODING {
184184
return Ok([patternStart, i]);
185185
}
186186
patternStart += (theCounters[0] + theCounters[1]) as usize;
@@ -199,11 +199,11 @@ impl Code93Reader {
199199
Err(Exceptions::NOT_FOUND)
200200
}
201201

202-
fn toPattern(counters: &[u32; 6]) -> i32 {
202+
fn toPattern<const N: usize>(counters: &[u32; N]) -> i32 {
203203
let sum = counters.iter().sum::<u32>();
204204

205205
let mut pattern = 0;
206-
let max = counters.len();
206+
let max = N;
207207
for (i, counter) in counters.iter().enumerate().take(max) {
208208
let scaled = (*counter as f32 * 9.0 / sum as f32).round() as u32;
209209
if !(1..=4).contains(&scaled) {

src/oned/itf_reader.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -333,14 +333,14 @@ impl ITFReader {
333333
* ints
334334
* @throws NotFoundException if pattern is not found
335335
*/
336-
fn findGuardPattern(
336+
fn findGuardPattern<const N: usize>(
337337
&self,
338338
row: &BitArray,
339339
rowOffset: usize,
340-
pattern: &[u32],
340+
pattern: &[u32; N],
341341
) -> Result<[usize; 2]> {
342-
let patternLength = pattern.len();
343-
let mut counters = vec![0u32; patternLength]; //new int[patternLength];
342+
let patternLength = N;
343+
let mut counters = [0u32; N]; //new int[patternLength];
344344
let width = row.get_size();
345345
let mut isWhite = false;
346346

@@ -384,7 +384,7 @@ impl ITFReader {
384384
* @return The decoded digit
385385
* @throws NotFoundException if digit cannot be decoded
386386
*/
387-
fn decodeDigit(&self, counters: &[u32]) -> Result<u32> {
387+
fn decodeDigit(&self, counters: &[u32; 5]) -> Result<u32> {
388388
let mut bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
389389
let mut bestMatch = -1_isize;
390390
for (i, pattern) in PATTERNS.iter().enumerate() {

src/oned/one_d_reader.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,12 @@ fn pad_bitarray(bits: &[u8], quiet_zone: usize) -> BitArray {
212212
* @param maxIndividualVariance The most any counter can differ before we give up
213213
* @return ratio of total variance between counters and pattern compared to total pattern size
214214
*/
215-
pub fn pattern_match_variance(
216-
counters: &[u32],
215+
pub fn pattern_match_variance<const N: usize>(
216+
counters: &[u32; N],
217217
pattern: &[u32],
218218
mut max_individual_variance: f32,
219219
) -> f32 {
220-
let num_counters = counters.len();
220+
let num_counters = N;
221221

222222
let total: f32 = counters.iter().sum::<u32>() as f32;
223223
let pattern_length: u32 = pattern.iter().take(num_counters).sum();
@@ -266,8 +266,12 @@ pub fn pattern_match_variance(
266266
* @throws NotFoundException if counters cannot be filled entirely from row before running out
267267
* of pixels
268268
*/
269-
pub fn record_pattern(row: &BitArray, start: usize, counters: &mut [u32]) -> Result<()> {
270-
let num_counters = counters.len();
269+
pub fn record_pattern<const N: usize>(
270+
row: &BitArray,
271+
start: usize,
272+
counters: &mut [u32; N],
273+
) -> Result<()> {
274+
let num_counters = N;
271275
counters.fill(0);
272276

273277
let end = row.get_size();
@@ -300,10 +304,14 @@ pub fn record_pattern(row: &BitArray, start: usize, counters: &mut [u32]) -> Res
300304
Ok(())
301305
}
302306

303-
pub fn record_pattern_in_reverse(row: &BitArray, start: usize, counters: &mut [u32]) -> Result<()> {
307+
pub fn record_pattern_in_reverse<const N: usize>(
308+
row: &BitArray,
309+
start: usize,
310+
counters: &mut [u32; N],
311+
) -> Result<()> {
304312
let mut start = start;
305313
// This could be more efficient I guess
306-
let mut num_transitions_left = counters.len() as isize;
314+
let mut num_transitions_left = N as isize;
307315
let mut last = row.get(start);
308316
while start > 0 && num_transitions_left >= 0 {
309317
start -= 1;

src/oned/rss/abstract_rss_reader.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ pub trait AbstractRSSReaderTrait: OneDReader {
3131
const MIN_FINDER_PATTERN_RATIO: f32 = 9.5 / 12.0;
3232
const MAX_FINDER_PATTERN_RATIO: f32 = 12.5 / 14.0;
3333

34-
fn parseFinderValue(counters: &[u32], finderPatterns: &[[u32; 4]]) -> Result<u32> {
34+
fn parseFinderValue<const N: usize>(
35+
counters: &[u32; N],
36+
finderPatterns: &[[u32; N]],
37+
) -> Result<u32> {
3538
for (value, pattern) in finderPatterns.iter().enumerate() {
3639
if one_d_reader::pattern_match_variance(
3740
counters,
@@ -69,7 +72,10 @@ pub trait AbstractRSSReaderTrait: OneDReader {
6972
array[index] -= 1;
7073
}
7174

72-
fn isFinderPattern(counters: &[u32]) -> bool {
75+
fn isFinderPattern<const N: usize>(counters: &[u32; N]) -> bool {
76+
if N < 4 {
77+
return false;
78+
}
7379
let firstTwoSum = counters[0] + counters[1];
7480
let sum = firstTwoSum + counters[2] + counters[3];
7581
let ratio: f32 = (firstTwoSum as f32) / (sum as f32);

src/oned/rss/expanded/rss_expanded_reader.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -758,12 +758,8 @@ impl RSSExpandedReader {
758758
Err(Exceptions::NOT_FOUND)
759759
}
760760

761-
fn reverseCounters(counters: &mut [u32]) {
761+
fn reverseCounters<const N: usize>(counters: &mut [u32; N]) {
762762
counters.reverse();
763-
// let length = counters.len();
764-
// for i in 0..length / 2 {
765-
// counters.swap(i, length - i - 1);
766-
// }
767763
}
768764

769765
fn parseFoundFinderPattern(
@@ -833,14 +829,6 @@ impl RSSExpandedReader {
833829
record_pattern(row, pattern.getStartEnd()[1], counters)?;
834830
// reverse it
835831
counters.reverse();
836-
// let mut i = 0;
837-
// let mut j = counters.len() - 1;
838-
// while i < j {
839-
// counters.swap(i, j);
840-
841-
// i += 1;
842-
// j -= 1;
843-
// }
844832
} //counters[] has the pixels of the module
845833

846834
//left and right data characters have all the same length

src/oned/rss/rss_14_reader.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -276,14 +276,6 @@ impl RSS14Reader {
276276
one_d_reader::record_pattern(row, pattern.getStartEnd()[1], counters)?;
277277
// reverse it
278278
counters.reverse();
279-
// let mut i = 0;
280-
// let mut j = counters.len() - 1;
281-
// while i < j {
282-
// counters.swap(i, j);
283-
284-
// i += 1;
285-
// j -= 1;
286-
// }
287279
}
288280

289281
let numModules = if outsideChar { 16 } else { 15 };

src/oned/upc_ean_reader.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -337,20 +337,14 @@ pub trait UPCEANReader: OneDReader {
337337
self.findGuardPattern(row, endStart, false, &START_END_PATTERN)
338338
}
339339

340-
fn findGuardPattern(
340+
fn findGuardPattern<const N: usize>(
341341
&self,
342342
row: &BitArray,
343343
rowOffset: usize,
344344
whiteFirst: bool,
345-
pattern: &[u32],
345+
pattern: &[u32; N],
346346
) -> Result<[usize; 2]> {
347-
self.findGuardPatternWithCounters(
348-
row,
349-
rowOffset,
350-
whiteFirst,
351-
pattern,
352-
&mut vec![0u32; pattern.len()],
353-
)
347+
self.findGuardPatternWithCounters(row, rowOffset, whiteFirst, pattern, &mut [0u32; N])
354348
}
355349

356350
/**
@@ -364,13 +358,13 @@ pub trait UPCEANReader: OneDReader {
364358
* @return start/end horizontal offset of guard pattern, as an array of two ints
365359
* @throws NotFoundException if pattern is not found
366360
*/
367-
fn findGuardPatternWithCounters(
361+
fn findGuardPatternWithCounters<const N: usize>(
368362
&self,
369363
row: &BitArray,
370364
rowOffset: usize,
371365
whiteFirst: bool,
372-
pattern: &[u32],
373-
counters: &mut [u32],
366+
pattern: &[u32; N],
367+
counters: &mut [u32; N],
374368
) -> Result<[usize; 2]> {
375369
let width = row.get_size();
376370
let rowOffset = if whiteFirst {
@@ -380,7 +374,7 @@ pub trait UPCEANReader: OneDReader {
380374
};
381375
let mut counterPosition = 0;
382376
let mut patternStart = rowOffset;
383-
let patternLength = pattern.len();
377+
let patternLength = N;
384378
let mut isWhite = whiteFirst;
385379
for x in rowOffset..width {
386380
// for (int x = rowOffset; x < width; x++) {

0 commit comments

Comments
 (0)