// SPDX-License-Identifier: LGPL-3.0-or-newer pragma solidity ^0.6.0; library IdToAddressBiMap { struct Data { mapping(uint64 => address) idToAddress; mapping(address => uint64) addressToId; } function hasId(Data storage self, uint64 id) internal view returns (bool) { return self.idToAddress[id + 1] != address(0); } function hasAddress(Data storage self, address addr) internal view returns (bool) { return self.addressToId[addr] != 0; } function getAddressAt(Data storage self, uint64 id) internal view returns (address) { require(hasId(self, id), "Must have ID to get Address"); return self.idToAddress[id + 1]; } function getId(Data storage self, address addr) internal view returns (uint64) { require(hasAddress(self, addr), "Must have Address to get ID"); return self.addressToId[addr] - 1; } function insert( Data storage self, uint64 id, address addr ) internal returns (bool) { require(addr != address(0), "Cannot insert zero address"); require(id != uint64(-1), "Cannot insert max uint64"); // Ensure bijectivity of the mappings if ( self.addressToId[addr] != 0 || self.idToAddress[id + 1] != address(0) ) { return false; } self.idToAddress[id + 1] = addr; self.addressToId[addr] = id + 1; return true; } }