| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- // example.sol
- contract example {
- // Process state
- enum State {
- Running,
- Sleeping,
- Waiting,
- Stopped,
- Zombie,
- StateCount
- }
- // Variables in contract storage
- State state;
- int32 pid;
- uint32 reaped = 3;
- // Constants
- State constant bad_state = State.Zombie;
- int32 constant first_pid = 1;
- // Our constructors
- constructor(int32 _pid) {
- // Set contract storage
- pid = _pid;
- }
- // Reading but not writing contract storage means function
- // can be declared view
- function is_zombie_reaper() public view returns (bool) {
- /* must be pid 1 and not zombie ourselves */
- return (pid == first_pid && state != State.Zombie);
- }
- // Returning a constant does not access storage at all, so
- // function can be declared pure
- function systemd_pid() public pure returns (uint32) {
- // Note that cast is required to change sign from
- // int32 to uint32
- return uint32(first_pid);
- }
- /// Convert celcius to fahrenheit
- function celcius2fahrenheit(int32 celcius) pure public returns (int32) {
- int32 fahrenheit = celcius * 9 / 5 + 32;
- return fahrenheit;
- }
- /// Convert fahrenheit to celcius
- function fahrenheit2celcius(int32 fahrenheit) pure public returns (int32) {
- return (fahrenheit - 32) * 5 / 9;
- }
- /// is this number a power-of-two
- function is_power_of_2(uint n) pure public returns (bool) {
- return n != 0 && (n & (n - 1)) == 0;
- }
- /// calculate the population count (number of set bits) using Brian Kerningham's way
- function population_count(uint n) pure public returns (uint count) {
- for (count = 0; n != 0; count++) {
- n &= (n - 1);
- }
- }
- /// calculate the power of base to exp
- function power(uint base, uint exp) pure public returns (uint) {
- return base ** exp;
- }
- /// returns true if the address is 0
- function is_address_zero(address a) pure public returns (bool) {
- return a == address(0);
- }
- /// reverse the bytes in an array of 8 (endian swap)
- function byte8reverse(bytes8 input) public pure returns (bytes8 out) {
- out = ((input << 56) & hex"ff00_0000_0000_0000") |
- ((input << 40) & hex"00ff_0000_0000_0000") |
- ((input << 24) & hex"0000_ff00_0000_0000") |
- ((input << 8) & hex"0000_00ff_0000_0000") |
- ((input >> 8) & hex"0000_0000_ff00_0000") |
- ((input >> 24) & hex"0000_0000_00ff_0000") |
- ((input >> 40) & hex"0000_0000_0000_ff00") |
- ((input >> 56) & hex"0000_0000_0000_00ff");
- }
- /// This mocks a pid state
- function get_pid_state(uint64 _pid) pure private returns (State) {
- uint64 n = 8;
- for (uint16 i = 1; i < 10; ++i) {
- if ((i % 3) == 0) {
- n *= _pid / uint64(i);
- } else {
- n /= 3;
- }
- }
- return State(n % uint64(State.StateCount));
- }
- /// Overloaded function with different return value!
- function get_pid_state() view private returns (uint32) {
- return reaped;
- }
- function reap_processes() public {
- uint32 n = 0;
- while (n < 100) {
- if (get_pid_state(n) == State.Zombie) {
- // reap!
- reaped += 1;
- }
- n++;
- }
- }
- function run_queue() public pure returns (uint16) {
- uint16 count = 0;
- // no initializer means its 0.
- uint32 n=0;
- do {
- if (get_pid_state(n) == State.Waiting) {
- count++;
- }
- }
- while (++n < 1000);
- return count;
- }
- // cards
- enum suit { club, diamonds, hearts, spades }
- enum value { two, three, four, five, six, seven, eight, nine, ten, jack, queen, king, ace }
- struct card {
- value v;
- suit s;
- }
- card card1 = card(value.two, suit.club);
- card card2 = card({s: suit.club, v: value.two});
- // This function does a lot of copying
- function set_card1(card memory c) public returns (card memory previous) {
- previous = card1;
- card1 = c;
- }
- /// return the ace of spades
- function ace_of_spaces() public pure returns (card memory) {
- return card({s: suit.spades, v: value.ace });
- }
- /// score card
- function score_card(card memory c) public pure returns (uint32 score) {
- if (c.s == suit.hearts) {
- if (c.v == value.ace) {
- score = 14;
- }
- if (c.v == value.king) {
- score = 13;
- }
- if (c.v == value.queen) {
- score = 12;
- }
- if (c.v == value.jack) {
- score = 11;
- }
- }
- // all others score 0
- }
- }
|