eint 1.0.0

Fixed-size signed/unsigned big integers.
Documentation
use eint::*;

#[test]
fn test_lo_sext_bug_0() {
    let x = E256([0xb12f7788023e73f4, 0xe2aaa5a70e8d29d2, 0x01f281f891d2d8b6, 0xff000000000923b3]);
    let y = E512([
        0xb12f7788023e73f4,
        0xe2aaa5a70e8d29d2,
        0x01f281f891d2d8b6,
        0xff000000000923b3,
        0xffffffffffffffff,
        0xffffffffffffffff,
        0xffffffffffffffff,
        0xffffffffffffffff,
    ]);
    assert_eq!(E512::from(x).lo_sext(), y);

    let x = E256([0xb12f7788023e73f4, 0xe2aaa5a70e8d29d2, 0x01f281f891d2d8b6, 0x00000000000923b3]);
    let y = E512([
        0xb12f7788023e73f4,
        0xe2aaa5a70e8d29d2,
        0x01f281f891d2d8b6,
        0x00000000000923b3,
        0x0000000000000000,
        0x0000000000000000,
        0x0000000000000000,
        0x0000000000000000,
    ]);
    assert_eq!(E512::from(x).lo_sext(), y);
}

#[test]
fn test_lowhex_bug_0() {
    let x = E64(0x000000ffffffff12);
    assert_eq!(format!("{:x}", x), String::from("000000ffffffff12"));
    let x = E256([0x012f7788023e73f4, 0xe2aaa5a70e8d29d2, 0x01f281f891d2d8b6, 0x00000000000923b3]);
    assert_eq!(format!("{:x}", x), String::from("00000000000923b301f281f891d2d8b6e2aaa5a70e8d29d2012f7788023e73f4"));
}

#[test]
fn test_overflowing_mul_s_bug_0() {
    let x: u64 = 0x000000ffffffff12;
    let y: u64 = 0xffffffffffffff00;
    let (r0, b0) = Eint::overflowing_mul_s(E64::from(x), E64::from(y));
    let (r1, b1) = (x as i64).overflowing_mul(y as i64);
    assert_eq!(r0, r1.into());
    assert_eq!(r0, E64(r1 as u64));
    assert_eq!(b0, b1);
}

#[test]
fn test_overflowing_mul_s_bug_1() {
    let x: u64 = 0xffffffff00000000;
    let y: u64 = 0xffffff12;
    let (r0, b0) = Eint::overflowing_mul_s(E64::from(x), E64::from(y));
    let (r1, b1) = (x as i64).overflowing_mul(y as i64);
    assert_eq!(r0, r1.into());
    assert_eq!(b0, b1);
}

#[test]
fn test_saturating_sub_u_bug_0() {
    let (r0, b0) = Eint::saturating_sub_u(E64(1), E64(1));
    assert_eq!(r0, E64(0));
    assert_eq!(b0, false);
}

#[test]
fn test_widening_mul_u_bug_0() {
    let x = E256([0xb12f7788023e73f4, 0xe2aaa5a70e8d29d2, 0x01f281f891d2d8b6, 0x00000000000923b3]);
    let y = E256([0x1d17f2885f4f575d, 0x75bc106493590c97, 0x0080fc6291ec2141, 0x0000000000000d7d]);
    let (lo, hi) = Eint::widening_mul_u(x, y);
    assert_eq!(lo.0[0], 0x2561c5195e640ba4);
    assert_eq!(lo.0[1], 0x16c693e22c0d44ce);
    assert_eq!(lo.0[2], 0xd28d858679950e54);
    assert_eq!(lo.0[3], 0xb3be16ce839dba7c);
    assert_eq!(hi.0[0], 0x0d773f050be2a524);
    assert_eq!(hi.0[1], 0x202d251fd914f3d8);
    assert_eq!(hi.0[2], 0x000000007b468a1c);
    assert_eq!(hi.0[3], 0x0000000000000000);
}