diff --git a/src/helpers.rs b/src/helpers.rs index b1d3b94..7047311 100644 --- a/src/helpers.rs +++ b/src/helpers.rs @@ -93,12 +93,31 @@ pub fn buffer_prefix_matches_marker( #[inline(always)] pub const fn devli(s: u8, value: u16) -> i16 { - if s == 0 { + let shifted = 1 << s; + + if value >= (shifted >> 1) { value as i16 - } else if value < (1 << (s as u16 - 1)) { - value as i16 + (-1 << s as i16) + 1 } else { - value as i16 + (value + !(shifted - 1) + 1) as i16 + } +} + +/// check to make sure the behavior hasn't changed even with the optimization +#[test] +fn devli_test() { + for s in 0u8..15 { + for value in 0..(1 << s) { + assert_eq!( + devli(s, value) as i16, + if s == 0 { + value as i16 + } else if value < (1 << (s as u16 - 1)) { + value as i16 + (-1 << s as i16) + 1 + } else { + value as i16 + } + ); + } } }