pub(super) const COUNT_PARALLEL_MAX_SHARDS: usize = 16;
pub(super) fn shard_range(start: &[u8], end: &[u8], desired: usize) -> Vec<(Vec<u8>, Vec<u8>)> {
if desired <= 1 || start >= end {
return vec![(start.to_vec(), end.to_vec())];
}
let common_max = start.len().min(end.len());
let mut p = 0;
while p < common_max && start[p] == end[p] {
p += 1;
}
if p >= start.len() || p >= end.len() {
return vec![(start.to_vec(), end.to_vec())];
}
let sb = start[p] as u32;
let eb = end[p] as u32;
if eb < sb + 2 {
return vec![(start.to_vec(), end.to_vec())];
}
let span = eb - sb;
let n = desired.min(span as usize);
if n <= 1 {
return vec![(start.to_vec(), end.to_vec())];
}
let prefix = &start[..p];
let mut shards = Vec::with_capacity(n);
let mut prev: Vec<u8> = start.to_vec();
for i in 1..n {
let b = sb + (span * i as u32 / n as u32);
if b == sb {
continue;
}
let mut boundary = prefix.to_vec();
boundary.push(b as u8);
if boundary.as_slice() > prev.as_slice() && boundary.as_slice() < end {
shards.push((prev.clone(), boundary.clone()));
prev = boundary;
}
}
shards.push((prev, end.to_vec()));
shards
}
#[cfg(test)]
mod tests {
use super::shard_range;
fn assert_valid(shards: &[(Vec<u8>, Vec<u8>)], start: &[u8], end: &[u8]) {
assert!(!shards.is_empty(), "expected at least one shard");
assert_eq!(shards.first().unwrap().0.as_slice(), start, "first shard lo == start");
assert_eq!(shards.last().unwrap().1.as_slice(), end, "last shard hi == end");
for shard in shards {
assert!(shard.0 < shard.1, "shard lo < hi: {:?} >= {:?}", shard.0, shard.1);
}
for pair in shards.windows(2) {
assert_eq!(pair[0].1, pair[1].0, "adjacent shards must touch exactly");
}
}
#[test]
fn empty_range_returns_single_shard() {
let s = shard_range(b"abc", b"abc", 8);
assert_eq!(s.len(), 1);
}
#[test]
fn reversed_range_returns_single_shard() {
let s = shard_range(b"z", b"a", 8);
assert_eq!(s.len(), 1);
}
#[test]
fn one_shard_when_desired_is_one() {
let s = shard_range(b"\x00", b"\xFF", 1);
assert_eq!(s.len(), 1);
assert_valid(&s, b"\x00", b"\xFF");
}
#[test]
fn full_byte_range_splits_into_desired_shards() {
let s = shard_range(b"\x00", b"\xFF", 8);
assert_eq!(s.len(), 8);
assert_valid(&s, b"\x00", b"\xFF");
}
#[test]
fn narrow_span_falls_back_to_single_shard() {
let s = shard_range(b"\x05", b"\x06", 8);
assert_eq!(s.len(), 1);
}
#[test]
fn prefix_only_falls_back_to_single_shard() {
let s = shard_range(b"ab", b"abc", 8);
assert_eq!(s.len(), 1);
}
#[test]
fn shared_prefix_then_diverge() {
let mut start = b"tbl\0*".to_vec();
start.push(0x00);
let mut end = b"tbl\0*".to_vec();
end.push(0xFF);
let s = shard_range(&start, &end, 16);
assert_eq!(s.len(), 16);
assert_valid(&s, &start, &end);
for (lo, hi) in &s {
assert!(lo.starts_with(b"tbl\0*"));
assert!(hi.starts_with(b"tbl\0*"));
}
}
#[test]
fn start_has_extra_bytes_after_pivot() {
let start = b"\x10\xAA\xBB".to_vec();
let end = b"\x80".to_vec();
let s = shard_range(&start, &end, 8);
assert_valid(&s, &start, &end);
}
#[test]
fn shards_cap_at_span() {
let s = shard_range(b"\x05", b"\x08", 16);
assert!(s.len() <= 3);
assert_valid(&s, b"\x05", b"\x08");
}
}