github.com/tri-stone/burrow@v0.25.0/tests/jobs_fixtures/app35-library_handling/lib-and-contract.sol (about)

     1  pragma solidity >=0.0.0;
     2  
     3  library Set {
     4    // We define a new struct datatype that will be used to
     5    // hold its data in the calling contract.
     6    struct Data { mapping(uint => bool) flags; }
     7  
     8    // Note that the first parameter is of type "storage
     9    // reference" and thus only its storage address and not
    10    // its contents is passed as part of the call.  This is a
    11    // special feature of library functions.  It is idiomatic
    12    // to call the first parameter 'self', if the function can
    13    // be seen as a method of that object.
    14    function insert(Data storage self, uint value)
    15        public returns (bool)
    16    {
    17        if (self.flags[value])
    18            return false; // already there
    19        self.flags[value] = true;
    20        return true;
    21    }
    22  
    23    function remove(Data storage self, uint value)
    24        public returns (bool)
    25    {
    26        if (!self.flags[value])
    27            return false; // not there
    28        self.flags[value] = false;
    29        return true;
    30    }
    31  
    32    function contains(Data storage self, uint value)
    33        public returns (bool)
    34    {
    35        return self.flags[value];
    36    }
    37  }
    38  
    39  
    40  contract C {
    41      Set.Data knownValues;
    42  
    43      function register(uint value) public {
    44          // The library functions can be called without a
    45          // specific instance of the library, since the
    46          // "instance" will be the current contract.
    47          if (!Set.insert(knownValues, value))
    48              revert();
    49      }
    50      // In this contract, we can also directly access knownValues.flags, if we want.
    51  }