11module integer_mate ::u256 {
2+ use std::error;
23 use integer_mate::math_u64;
34 use integer_mate::math_u128;
45
@@ -17,7 +18,7 @@ module integer_mate::u256 {
1718
1819 /// Total words in `U256` (64 * 4 = 256).
1920 const WORDS : u8 = 4 ;
20-
21+
2122 struct U256 has copy , drop , store {
2223 n0: u64 ,
2324 n1: u64 ,
@@ -57,7 +58,7 @@ module integer_mate::u256 {
5758 let (sum1, carry1) = math_u64::carry_add (a.n1, b.n1, carry0);
5859 let (sum2, carry2) = math_u64::carry_add (a.n2, b.n2, carry1);
5960 let (sum3, carry3) = math_u64::carry_add (a.n3, b.n3, carry2);
60- assert ! (carry3 == 0 , OVERFLOW );
61+ assert ! (carry3 == 0 , error:: invalid_argument ( OVERFLOW ) );
6162 U256 {
6263 n0: sum0,
6364 n1: sum1,
@@ -78,7 +79,7 @@ module integer_mate::u256 {
7879 let (t3, overflow_t3) = math_u64::overflowing_sub (a.n3, b.n3);
7980 let (r3, overflow_s3) = math_u64::overflowing_sub (t3, carry2);
8081 let carry3 = if (overflow_t3 || overflow_s3) { 1 } else { 0 };
81- assert ! (carry3 == 0 , OVERFLOW );
82+ assert ! (carry3 == 0 , error:: invalid_argument ( OVERFLOW ) );
8283 U256 {
8384 n0: r0,
8485 n1: r1,
@@ -115,7 +116,6 @@ module integer_mate::u256 {
115116 result
116117 }
117118
118- // TODO: OPT
119119 public fun div_mod (a: U256 , b: U256 ): (U256 , U256 ) {
120120 let ret = zero ();
121121 let remainer = a;
@@ -160,12 +160,12 @@ module integer_mate::u256 {
160160 }
161161
162162 public fun as_u128 (n: U256 ): u128 {
163- assert ! (n.n3 == 0 && n.n2 == 0 , OVERFLOW );
163+ assert ! (n.n3 == 0 && n.n2 == 0 , error:: invalid_argument ( OVERFLOW ) );
164164 math_u128::from_lo_hi (n.n0, n.n1)
165165 }
166166
167167 public fun as_u64 (n: U256 ): u64 {
168- assert ! (n.n3 == 0 && n.n2 == 0 && n.n1 == 0 , OVERFLOW );
168+ assert ! (n.n3 == 0 && n.n2 == 0 && n.n1 == 0 , error:: invalid_argument ( OVERFLOW ) );
169169 n.n0
170170 }
171171
@@ -293,8 +293,7 @@ module integer_mate::u256 {
293293 public fun checked_div_round (num: U256 , denom: U256 , round_up: bool ): U256 {
294294 let (q, r) = div_mod (num, denom);
295295 if (round_up && gt (r, zero ())) {
296- q.n0 = q.n0 + 1 ;
297- //return add(q, from(1))
296+ return add (q, from (1 ))
298297 };
299298 q
300299 }
@@ -412,16 +411,15 @@ module integer_mate::u256 {
412411
413412 #[test]
414413 fun test_add () {
415- add (from (1000 ), from (1000 ));
416- // let s = add(new(10, 10, 10, 10), new(10, 10, 10, 10));
417- // assert!(s.n0 == 20 && s.n1 == 20 && s.n2 == 20 && s.n3 == 20, 0);
418- //
419- // let s = add(from(0xffffffffffffffffffffffffffffffff), from(0xffffffffffffffffffffffffffffffff));
420- // assert!(s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 1 && s.n3 == 0, 0);
421- //
422- // let max = MAX_U64;
423- // let s = add(new(max, max, max, 10), new(max, max, max, 10));
424- // assert!(s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 18446744073709551615 && s.n3 == 21, 0);
414+ let s = add (new (10 , 10 , 10 , 10 ), new (10 , 10 , 10 , 10 ));
415+ assert ! (s.n0 == 20 && s.n1 == 20 && s.n2 == 20 && s.n3 == 20 , 0 );
416+
417+ let s = add (from (0xffffffffffffffffffffffffffffffff ), from (0xffffffffffffffffffffffffffffffff ));
418+ assert ! (s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 1 && s.n3 == 0 , 0 );
419+
420+ let max = MAX_U64 ;
421+ let s = add (new (max, max, max, 10 ), new (max, max, max, 10 ));
422+ assert ! (s.n0 == 18446744073709551614 && s.n1 == 18446744073709551615 && s.n2 == 18446744073709551615 && s.n3 == 21 , 0 );
425423 }
426424
427425 #[test]
@@ -595,14 +593,4 @@ module integer_mate::u256 {
595593 //assert!(eq(checked_div_round(from(MAX_U128), from((MAX_U64 as u128)), true), from((MAX_U128 / 10) + 1)) == true, 0);
596594 //assert!(eq(checked_div_round(from(MAX_U128), from((MAX_U64 as u128)), false), from((MAX_U128 / 10))) == true, 0);
597595 }
598-
599- #[test]
600- fun test_div_round () {
601- checked_div_round (from (1000000000000000000000000000 ), from (3 ), true );
602- }
603-
604- #[test]
605- fun test_2_div () {
606- div_mod (from (1 ), from (1 ));
607- }
608596}
0 commit comments