Fix SInt::for_value not accounting for sign bit for positive values
All checks were successful
/ deps (pull_request) Successful in 14s
/ test (pull_request) Successful in 4m42s
/ deps (push) Successful in 13s
/ test (push) Successful in 4m39s

Fixes: #4
This commit is contained in:
Jacob Lifshay 2024-11-26 16:26:29 -08:00
parent 3ea0d98924
commit c45624e3c2
Signed by: programmerjake
SSH key fingerprint: SHA256:HnFTLGpSm4Q4Fj502oCFisjZSoakwEuTsJJMSke63RQ

View file

@ -453,7 +453,10 @@ impl SInt {
v.not().bits().checked_add(1).expect("too big")
}
Sign::NoSign => 0,
Sign::Plus => v.bits(),
Sign::Plus => {
// account for sign bit
v.bits().checked_add(1).expect("too big")
}
}
.try_into()
.expect("too big"),
@ -693,3 +696,31 @@ impl ToLiteralBits for bool {
Ok(interned_bit(*self))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_uint_for_value() {
assert_eq!(UInt::for_value(0u8).width, 0);
assert_eq!(UInt::for_value(1u8).width, 1);
assert_eq!(UInt::for_value(2u8).width, 2);
assert_eq!(UInt::for_value(3u8).width, 2);
assert_eq!(UInt::for_value(4u8).width, 3);
}
#[test]
fn test_sint_for_value() {
assert_eq!(SInt::for_value(-5).width, 4);
assert_eq!(SInt::for_value(-4).width, 3);
assert_eq!(SInt::for_value(-3).width, 3);
assert_eq!(SInt::for_value(-2).width, 2);
assert_eq!(SInt::for_value(-1).width, 1);
assert_eq!(SInt::for_value(0).width, 0);
assert_eq!(SInt::for_value(1).width, 2);
assert_eq!(SInt::for_value(2).width, 3);
assert_eq!(SInt::for_value(3).width, 3);
assert_eq!(SInt::for_value(4).width, 4);
}
}