Skip to content

Commit a24280b

Browse files
committed
fix build in COVER_group
an off-by-one
1 parent 3c2f02a commit a24280b

File tree

1 file changed

+101
-13
lines changed

1 file changed

+101
-13
lines changed

lib/dictBuilder/cover.rs

Lines changed: 101 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl COVER_map_pair_t {
6363
};
6464
}
6565

66-
#[derive(Debug, Default)]
66+
#[derive(Debug, Default, Clone)]
6767
#[repr(C)]
6868
struct COVER_ctx_t<'a> {
6969
samples: &'a [u8],
@@ -391,28 +391,28 @@ fn COVER_groupBy(ctx: &mut COVER_ctx_t, cmp: fn(&COVER_ctx_t, &u32, &u32) -> Ord
391391
}
392392
}
393393

394-
fn COVER_group(ctx: &mut COVER_ctx_t, range: Range<usize>) {
395-
let dmerId = range.start as u32;
394+
fn COVER_group(ctx: &mut COVER_ctx_t, range: Range<usize>) -> u32 {
395+
let dmer_id = range.start as u32;
396396
let group = &mut ctx.suffix[range];
397397
let mut freq = 0u32;
398-
let mut curOffsetPtr = &ctx.offsets[..ctx.nbSamples];
399-
let mut curSampleEnd = ctx.offsets[0];
398+
let offsets = &ctx.offsets[..ctx.nbSamples + 1];
399+
let mut cur_offset = 0;
400+
let mut cur_sample_end = ctx.offsets[0];
400401
let mut it = group.iter().map(|v| *v as usize).peekable();
401402
while let Some(v) = it.next() {
402-
ctx.dmerAt[v] = dmerId;
403-
if v >= curSampleEnd {
403+
ctx.dmerAt[v] = dmer_id;
404+
if v >= cur_sample_end {
404405
freq += 1;
405-
if curOffsetPtr.is_empty() {
406-
break;
407-
}
408406
if it.peek().is_some() {
409-
let sampleEndPtr = COVER_lower_bound(curOffsetPtr, v);
410-
curSampleEnd = curOffsetPtr[sampleEndPtr];
411-
curOffsetPtr = &curOffsetPtr[sampleEndPtr + 1..];
407+
let n = COVER_lower_bound(&ctx.offsets[cur_offset..ctx.nbSamples], v);
408+
let sampleEndPtr = cur_offset + n;
409+
cur_sample_end = offsets[sampleEndPtr];
410+
cur_offset = sampleEndPtr + 1;
412411
}
413412
}
414413
}
415414
group[0] = freq;
415+
freq
416416
}
417417

418418
unsafe fn COVER_selectSegment(
@@ -1409,3 +1409,91 @@ pub unsafe extern "C" fn ZDICT_optimizeTrainFromBuffer_cover(
14091409
POOL_free(pool);
14101410
dictSize
14111411
}
1412+
1413+
#[cfg(test)]
1414+
mod test {
1415+
use super::*;
1416+
1417+
#[test]
1418+
fn test_lower_bound() {
1419+
assert_eq!(COVER_lower_bound(&[255, 267], 251), 0);
1420+
1421+
assert_eq!(
1422+
COVER_lower_bound(
1423+
&[
1424+
0, 12, 22, 28, 33, 42, 51, 63, 75, 87, 99, 111, 123, 135, 147, 159, 171, 183,
1425+
195, 207, 219, 231, 243, 255, 267,
1426+
],
1427+
47,
1428+
),
1429+
6
1430+
);
1431+
}
1432+
1433+
#[test]
1434+
fn test_group() {
1435+
let offsets = [
1436+
0, 11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132, 143, 154, 165, 176, 187, 198,
1437+
209, 220, 231, 242, 253, 264, 275, 286, 297, 308, 319, 330, 341, 352, 363, 374, 385,
1438+
396, 407, 418, 429, 440, 451, 462, 473, 484, 495, 506, 517, 528, 539, 550, 561, 572,
1439+
583, 594, 605, 616, 627, 638, 649, 660, 671, 682, 693, 704, 715, 726, 737, 748, 759,
1440+
770, 781, 792, 803, 814, 825, 836, 847, 858, 869, 880, 891, 902, 913, 924, 935, 946,
1441+
957, 968, 979, 990, 1001, 1012, 1023, 1034, 1045, 1056, 1067, 1078, 1089, 1100,
1442+
];
1443+
let suffix_range = [
1444+
2, 3, 4, 5, 6, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 35, 36, 37, 38, 39, 46, 47, 48,
1445+
49, 50, 57, 58, 59, 60, 61, 68, 69, 70, 71, 72, 79, 80, 81, 82, 83, 90, 91, 92, 93, 94,
1446+
101, 102, 103, 104, 105, 112, 113, 114, 115, 116, 123, 124, 125, 126, 127, 134, 135,
1447+
136, 137, 138, 145, 146, 147, 148, 149, 156, 157, 158, 159, 160, 167, 168, 169, 170,
1448+
171, 178, 179, 180, 181, 182, 189, 190, 191, 192, 193, 200, 201, 202, 203, 204, 211,
1449+
212, 213, 214, 215, 222, 223, 224, 225, 226, 233, 234, 235, 236, 237, 244, 245, 246,
1450+
247, 248, 255, 256, 257, 258, 259, 266, 267, 268, 269, 270, 277, 278, 279, 280, 281,
1451+
288, 289, 290, 291, 292, 299, 300, 301, 302, 303, 310, 311, 312, 313, 314, 321, 322,
1452+
323, 324, 325, 332, 333, 334, 335, 336, 343, 344, 345, 346, 347, 354, 355, 356, 357,
1453+
358, 365, 366, 367, 368, 369, 376, 377, 378, 379, 380, 387, 388, 389, 390, 391, 398,
1454+
399, 400, 401, 402, 409, 410, 411, 412, 413, 420, 421, 422, 423, 424, 431, 432, 433,
1455+
434, 435, 442, 443, 444, 445, 446, 453, 454, 455, 456, 457, 464, 465, 466, 467, 468,
1456+
475, 476, 477, 478, 479, 486, 487, 488, 489, 490, 497, 498, 499, 500, 501, 508, 509,
1457+
510, 511, 512, 519, 520, 521, 522, 523, 530, 531, 532, 533, 534, 541, 542, 543, 544,
1458+
545, 552, 553, 554, 555, 556, 563, 564, 565, 566, 567, 574, 575, 576, 577, 578, 585,
1459+
586, 587, 588, 589, 596, 597, 598, 599, 600, 607, 608, 609, 610, 611, 618, 619, 620,
1460+
621, 622, 629, 630, 631, 632, 633, 640, 641, 642, 643, 644, 651, 652, 653, 654, 655,
1461+
662, 663, 664, 665, 666, 673, 674, 675, 676, 677, 684, 685, 686, 687, 688, 695, 696,
1462+
697, 698, 699, 706, 707, 708, 709, 710, 717, 718, 719, 720, 721, 728, 729, 730, 731,
1463+
732, 739, 740, 741, 742, 743, 750, 751, 752, 753, 754, 761, 762, 763, 764, 765, 772,
1464+
773, 774, 775, 776, 783, 784, 785, 786, 787, 794, 795, 796, 797, 798, 805, 806, 807,
1465+
808, 809, 816, 817, 818, 819, 820, 827, 828, 829, 830, 831, 838, 839, 840, 841, 842,
1466+
849, 850, 851, 852, 853, 860, 861, 862, 863, 864, 871, 872, 873, 874, 875, 882, 883,
1467+
884, 885, 886, 893, 894, 895, 896, 897, 904, 905, 906, 907, 908, 915, 916, 917, 918,
1468+
919, 926, 927, 928, 929, 930, 937, 938, 939, 940, 941, 948, 949, 950, 951, 952, 959,
1469+
960, 961, 962, 963, 970, 971, 972, 973, 974, 981, 982, 983, 984, 985, 992, 993, 994,
1470+
995, 996, 1003, 1004, 1005, 1006, 1007, 1014, 1015, 1016, 1017, 1018, 1025, 1026, 1027,
1471+
1028, 1029, 1036, 1037, 1038, 1039, 1040, 1047, 1048, 1049, 1050, 1051, 1058, 1059,
1472+
1060, 1061, 1062, 1069, 1070, 1071, 1072, 1073, 1080, 1081, 1082, 1083, 1084, 1091,
1473+
1092,
1474+
];
1475+
1476+
let range = 497..994;
1477+
let nbSamples = 100;
1478+
1479+
let mut suffix = vec![0; range.end];
1480+
suffix[range.start..range.end].copy_from_slice(&suffix_range);
1481+
1482+
let mut ctx = COVER_ctx_t {
1483+
samples: &[],
1484+
offsets: offsets.into(),
1485+
samplesSizes: &[],
1486+
nbSamples,
1487+
nbTrainSamples: 0,
1488+
nbTestSamples: 0,
1489+
suffixSize: suffix.len(),
1490+
suffix: suffix.into(),
1491+
freqs: Box::default(),
1492+
dmerAt: vec![0; 1 << 16].into(),
1493+
d: 0,
1494+
displayLevel: 0,
1495+
};
1496+
1497+
assert_eq!(COVER_group(&mut ctx, range), 100);
1498+
}
1499+
}

0 commit comments

Comments
 (0)