use super::ptr_span::has_at_least;
fn remaining(consumed: usize, len: usize, count: usize) -> bool {
len - consumed >= count
}
#[test]
fn the_guard_matches_the_remaining_element_count_everywhere() {
for len in 0..=80usize {
let buffer = vec![0.0f32; len];
let start = buffer.as_ptr();
let end = unsafe { start.add(len) };
for consumed in 0..=len {
let cur = unsafe { start.add(consumed) };
for count in [1usize, 2, 4, 8, 16, 32] {
assert_eq!(
has_at_least(cur, end, count),
remaining(consumed, len, count),
"len {len}, consumed {consumed}, count {count}"
);
}
}
}
}
#[test]
fn an_empty_range_has_room_for_nothing() {
let empty: Vec<f32> = Vec::new();
let start = empty.as_ptr();
for count in [1usize, 8, 16] {
assert!(!has_at_least(start, start, count));
}
assert!(has_at_least(start, start, 0));
}
#[test]
fn a_cursor_past_the_end_fails_closed() {
let buffer = [0.0f32; 32];
let start = buffer.as_ptr();
let (end, past) = unsafe { (start.add(16), start.add(24)) };
assert!(!has_at_least(past, end, 1));
assert!(!has_at_least(past, end, 16));
}
#[test]
fn the_loop_consumes_every_full_chunk_and_no_more() {
for len in 0..=80usize {
for count in [8usize, 16] {
let buffer = vec![0.0f32; len];
let start = buffer.as_ptr();
let end = unsafe { start.add(len) };
let mut cur = start;
let mut chunks = 0usize;
while has_at_least(cur, end, count) {
chunks += 1;
cur = unsafe { cur.add(count) };
}
assert_eq!(chunks, len / count, "len {len}, count {count}");
let left = unsafe { end.offset_from(cur) };
assert_eq!(
usize::try_from(left).expect("cursor never passes end"),
len % count,
"len {len}, count {count}: tail left for the scalar path"
);
}
}
}