geometry_box/
number_box.rs1#[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}