#include <array>
#include <iostream>
#include <limits>

extern "C" unsigned twice_next(unsigned);
extern "C" int signed_step(int);
extern "C" unsigned read_twice(unsigned);

int main() {
    static_assert(std::numeric_limits<unsigned>::digits == 32);
    static_assert(std::numeric_limits<int>::digits == 31);
    const std::array<unsigned, 3> straight_inputs{0U, 5U, 4294967295U};
    for (const unsigned x : straight_inputs) {
        std::cout << "straight(" << x << ")=" << twice_next(x) << '\n';
    }
    const std::array<int, 3> branch_inputs{3, -2, 0};
    for (const int x : branch_inputs) {
        std::cout << "branch(" << x << ")=" << signed_step(x) << '\n';
    }
    const std::array<unsigned, 3> memory_inputs{7U, 0U, 4294967295U};
    for (const unsigned x : memory_inputs) {
        std::cout << "memory(" << x << ")=" << read_twice(x) << '\n';
    }
    // The independent runner compares all nine lines against specified results.
}
