sway_types/
integer_bits.rs1use 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 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}