#[inline]
pub fn seq_before(a: u32, b: u32) -> bool {
(a.wrapping_sub(b) as i32) < 0
}
#[inline]
pub fn seq_after(a: u32, b: u32) -> bool {
(a.wrapping_sub(b) as i32) > 0
}
#[inline]
pub fn seq_before_eq(a: u32, b: u32) -> bool {
(a.wrapping_sub(b) as i32) <= 0
}
#[inline]
pub fn seq_after_eq(a: u32, b: u32) -> bool {
(a.wrapping_sub(b) as i32) >= 0
}
#[inline]
pub fn seq_in_range(seq: u32, lo: u32, hi: u32) -> bool {
seq_after_eq(seq, lo) && seq_before(seq, hi)
}
#[inline]
pub fn seq_in_range_inclusive(seq: u32, lo: u32, hi: u32) -> bool {
seq_after_eq(seq, lo) && seq_before_eq(seq, hi)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn basic_ordering() {
assert!(seq_before(1, 2));
assert!(!seq_before(2, 1));
assert!(seq_after(2, 1));
assert!(!seq_after(1, 2));
assert!(seq_before_eq(1, 1));
assert!(seq_after_eq(1, 1));
}
#[test]
fn wraparound() {
assert!(seq_before(0xFFFFFFFE, 1));
assert!(seq_after(1, 0xFFFFFFFE));
assert!(seq_in_range(0xFFFFFFFF, 0xFFFFFFFE, 2));
assert!(seq_in_range(0, 0xFFFFFFFE, 2));
assert!(!seq_in_range(2, 0xFFFFFFFE, 2));
assert!(seq_in_range_inclusive(2, 0xFFFFFFFE, 2));
}
}