geometry_box/
number_box.rs

1#[derive(Debug, Copy, Clone, Default)]
2#[repr(C)]
3pub struct U128Box {
4    pub high: u64,
5    pub low: u64,
6}
7
8impl U128Box {
9    pub fn from(number: u128) -> Self {
10        number.into()
11    }
12
13    pub fn be_zero(&mut self) {
14        self.set(0);
15    }
16
17    pub fn set(&mut self, number: u128) {
18        let boxed_number: U128Box = number.into();
19        self.clone_from(&boxed_number);
20    }
21
22    pub fn get(&self) -> u128 {
23        self.into()
24    }
25}
26
27impl From<&U128Box> for u128 {
28    fn from(boxed_number: &U128Box) -> u128 {
29        ((boxed_number.high as u128) << 64) + (boxed_number.low as u128)
30    }
31}
32
33impl From<u128> for U128Box {
34    fn from(number: u128) -> U128Box {
35        let low = number as u64;
36        let high = (number >> 64) as u64;
37        U128Box { high, low }
38    }
39}
40
41#[test]
42pub fn uint128_max() {
43    println!("u128 max: {:?}", std::u128::MAX);
44    let number = U128Box::from(std::u128::MAX);
45    assert_eq!(number.get(), std::u128::MAX)
46}
47
48#[test]
49pub fn uint128_min() {
50    println!("u128 min: {:?}", std::u128::MIN);
51    let number = U128Box::from(std::u128::MIN);
52    assert_eq!(number.get(), std::u128::MIN)
53}