raptorq/
util.rs

1// Get two non-overlapping ranges starting at i & j, both with length len
2pub fn get_both_ranges<T>(
3    vector: &mut [T],
4    i: usize,
5    j: usize,
6    len: usize,
7) -> (&mut [T], &mut [T]) {
8    debug_assert_ne!(i, j);
9    debug_assert!(i + len <= vector.len());
10    debug_assert!(j + len <= vector.len());
11    if i < j {
12        debug_assert!(i + len <= j);
13        let (first, last) = vector.split_at_mut(j);
14        return (&mut first[i..(i + len)], &mut last[0..len]);
15    } else {
16        debug_assert!(j + len <= i);
17        let (first, last) = vector.split_at_mut(i);
18        return (&mut last[0..len], &mut first[j..(j + len)]);
19    }
20}
21
22pub fn get_both_indices<T>(vector: &mut [T], i: usize, j: usize) -> (&mut T, &mut T) {
23    debug_assert_ne!(i, j);
24    debug_assert!(i < vector.len());
25    debug_assert!(j < vector.len());
26    if i < j {
27        let (first, last) = vector.split_at_mut(j);
28        return (&mut first[i], &mut last[0]);
29    } else {
30        let (first, last) = vector.split_at_mut(i);
31        return (&mut last[0], &mut first[j]);
32    }
33}
34
35// This should eventually become <https://doc.rust-lang.org/std/primitive.u64.html#method.div_ceil>
36// when it gets stabilized, and this function should be removed.
37// (1) the result is known to not overflow u32 from elsewhere;
38// (2) `denom` is known to not be `0` from elsewhere.
39// TODO this is definitely not always the case! Let's do something about it.
40pub fn int_div_ceil(num: u64, denom: u64) -> u32 {
41    if num % denom == 0 {
42        (num / denom) as u32
43    } else {
44        (num / denom + 1) as u32
45    }
46}