@@ -904,4 +904,36 @@ contract EnumerableSetLibTest is SoladyTest {
904904 }
905905 }
906906 }
907+
908+ function testIndexOfDirtyUpperBits () public {
909+ addressSet.add (address (0 ));
910+ for (uint256 i = 1 ; i != 5 ; ++ i) {
911+ addressSet.add (address (uint160 (i)));
912+ }
913+ assertEq (addressSet.length (), 5 );
914+
915+ address dirtyZero = _dirtyAddress (address (0 ), 1 );
916+ assertTrue (addressSet.contains (dirtyZero));
917+ assertEq (addressSet.indexOf (dirtyZero), 0 );
918+
919+ address dirtyThree = _dirtyAddress (address (uint160 (3 )), 0xabc );
920+ assertTrue (addressSet.contains (dirtyThree));
921+ assertEq (addressSet.indexOf (dirtyThree), addressSet.indexOf (address (uint160 (3 ))));
922+ }
923+
924+ function testIndexOfDirtyUpperBitsLazy () public {
925+ addressSet.add (address (0 ));
926+ addressSet.add (address (uint160 (1 )));
927+ assertEq (addressSet.length (), 2 );
928+
929+ assertEq (addressSet.indexOf (_dirtyAddress (address (0 ), 1 )), 0 );
930+ assertEq (addressSet.indexOf (_dirtyAddress (address (uint160 (1 )), 0xabc )), 1 );
931+ }
932+
933+ function _dirtyAddress (address a , uint256 dirt ) internal pure returns (address result ) {
934+ /// @solidity memory-safe-assembly
935+ assembly {
936+ result := or (a, shl (160 , dirt))
937+ }
938+ }
907939}
0 commit comments