mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| type Int is int64;
 | |
| using {
 | |
|     bitor as |, bitand as &, bitxor as ^, bitnot as ~,
 | |
|     add as +, sub as -, unsub as -, mul as *, div as /, mod as %
 | |
| } for Int global;
 | |
| 
 | |
| function bitor(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) | Int.unwrap(y)); }
 | |
| function bitand(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) & Int.unwrap(y)); }
 | |
| function bitxor(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) ^ Int.unwrap(y)); }
 | |
| function bitnot(Int x) pure returns (Int) { return Int.wrap(~Int.unwrap(x)); }
 | |
| 
 | |
| function add(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) + Int.unwrap(y)); }
 | |
| function sub(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) - Int.unwrap(y)); }
 | |
| function unsub(Int x) pure returns (Int) { return Int.wrap(-Int.unwrap(x)); }
 | |
| function mul(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) * Int.unwrap(y)); }
 | |
| function div(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) / Int.unwrap(y)); }
 | |
| function mod(Int x, Int y) pure returns (Int) { return Int.wrap(Int.unwrap(x) % Int.unwrap(y)); }
 | |
| 
 | |
| contract C {
 | |
|     Int constant I0 = Int.wrap(0);
 | |
|     Int constant I1 = Int.wrap(1);
 | |
|     Int constant I2 = Int.wrap(2);
 | |
|     Int constant I3 = Int.wrap(3);
 | |
|     Int constant I4 = Int.wrap(4);
 | |
|     Int constant I5 = Int.wrap(5);
 | |
|     Int constant I6 = Int.wrap(6);
 | |
|     Int constant I7 = Int.wrap(7);
 | |
|     Int constant I8 = Int.wrap(8);
 | |
|     Int constant I10 = Int.wrap(10);
 | |
|     Int constant I13 = Int.wrap(13);
 | |
|     Int constant I15 = Int.wrap(15);
 | |
|     Int constant I20 = Int.wrap(20);
 | |
|     Int constant I128 = Int.wrap(128);
 | |
| 
 | |
|     function testBitwise() public pure {
 | |
|         assert(Int.unwrap(I0 & I0 | I1) == (0 & 0 | 1));
 | |
|         assert(Int.unwrap(I0 & I0 | I1) == ((0 & 0) | 1));
 | |
|     }
 | |
| 
 | |
|     function testBitwise_arithmetic() public pure {
 | |
|         assert(Int.unwrap(I2 + I2 & ~I1 | I6 * I6 - I4 & ~I3) == (2 + 2 & ~1 | 6 * 6 - 4 & ~3));
 | |
|         assert(Int.unwrap(I2 + I2 & ~I1 | I6 * I6 - I4 & ~I3) == (((2 + 2) & (~1)) | (((6 * 6) - 4) & (~3))));
 | |
|     }
 | |
| 
 | |
|     function testArithmetic() public pure {
 | |
|         assert(Int.unwrap(I1 + I8 / I4 - I5 % I6 * I7) == (1 + 8 / 4 - 5 % 6 * 7));
 | |
|         assert(Int.unwrap(I1 + I8 / I4 - I5 % I6 * I7) == ((1 + (8 / 4)) - ((5 % 6) * 7)));
 | |
|     }
 | |
| 
 | |
|     function testAll() public pure {
 | |
|         assert(
 | |
|             Int.unwrap(I128 + I1 - I10 + I4 & ~I1 ^ ~I1 * I2 | -I15 % -I10 * I20 / I2 + I13 & ~I3) ==
 | |
|             (128 + 1 - 10 + 4 & ~1 ^ ~1 * 2 | -15 % -10 * 20 / 2 + 13 & ~3)
 | |
|         );
 | |
|         assert(
 | |
|             Int.unwrap(I128 + I1 - I10 + I4 & ~I1 ^ ~I1 * I2 | -I15 % -I10 * I20 / I2 + I13 & ~I3) ==
 | |
|             (
 | |
|                 (
 | |
|                     ((((128 + 1) - 10) + 4) & (~1)) ^
 | |
|                     ((~1) * 2)
 | |
|                 ) |
 | |
|                 ((((((-15) % (-10)) * 20) / 2) + 13) & (~3))
 | |
|             )
 | |
|         );
 | |
|     }
 | |
| }
 | |
| // ----
 | |
| // testBitwise() ->
 | |
| // testBitwise_arithmetic() ->
 | |
| // testArithmetic() ->
 | |
| // testAll() ->
 |