graphics/
modular_index.rs1#[inline(always)]
5pub fn offset(n: usize, i: usize, off: isize) -> usize {
6 (i + (off % n as isize + n as isize) as usize) % n
7}
8
9#[inline(always)]
11pub fn previous(n: usize, i: usize) -> usize {
12 offset(n, i, -1)
13}
14
15#[inline(always)]
17pub fn next(n: usize, i: usize) -> usize {
18 offset(n, i, 1)
19}
20
21#[cfg(test)]
22mod tests {
23 use super::*;
24
25 #[test]
26 fn test_offset() {
27 assert_eq!(offset(3, 0, -1), 2);
28 assert_eq!(offset(3, 1, -1), 0);
29 assert_eq!(offset(3, 2, -1), 1);
30 assert_eq!(offset(3, 3, -1), 2);
31
32 assert_eq!(offset(3, 0, 1), 1);
33 assert_eq!(offset(3, 1, 1), 2);
34 assert_eq!(offset(3, 2, 1), 0);
35 assert_eq!(offset(3, 3, 1), 1);
36 }
37}