sway_types/
integer_bits.rs

1use std::fmt;
2
3#[derive(Eq, PartialEq, Hash, Debug, Clone, Copy, PartialOrd, Ord)]
4pub enum IntegerBits {
5    Eight,
6    Sixteen,
7    ThirtyTwo,
8    SixtyFour,
9    V256,
10}
11
12impl IntegerBits {
13    /// Returns if `v` would overflow using `self` bits or not.
14    pub fn would_overflow(&self, v: u64) -> bool {
15        if v == 0 {
16            return false;
17        }
18
19        let needed_bits = v.ilog2() + 1;
20        let bits = match self {
21            IntegerBits::Eight => 8,
22            IntegerBits::Sixteen => 16,
23            IntegerBits::ThirtyTwo => 32,
24            IntegerBits::SixtyFour => 64,
25            IntegerBits::V256 => return false,
26        };
27
28        needed_bits > bits
29    }
30}
31
32#[test]
33fn would_overflow_tests() {
34    assert!(!IntegerBits::Eight.would_overflow(0));
35
36    assert!(!IntegerBits::Eight.would_overflow(0xFF));
37    assert!(IntegerBits::Eight.would_overflow(0x100));
38
39    assert!(!IntegerBits::Sixteen.would_overflow(0xFFFF));
40    assert!(IntegerBits::Sixteen.would_overflow(0x10000));
41
42    assert!(!IntegerBits::ThirtyTwo.would_overflow(0xFFFFFFFF));
43    assert!(IntegerBits::ThirtyTwo.would_overflow(0x100000000));
44
45    assert!(!IntegerBits::SixtyFour.would_overflow(0xFFFFFFFFFFFFFFFF));
46}
47
48impl fmt::Display for IntegerBits {
49    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50        use IntegerBits::{Eight, Sixteen, SixtyFour, ThirtyTwo, V256};
51        let s = match self {
52            Eight => "eight",
53            Sixteen => "sixteen",
54            ThirtyTwo => "thirty two",
55            SixtyFour => "sixty four",
56            V256 => "256",
57        };
58        write!(f, "{s}")
59    }
60}