// Original CPU teaching model; not a device simulator or benchmark.
#include <iostream>
#include <array>
#include <cstdint>
#include <cstddef>
#include <stdexcept>

void require(bool ok) { if (!ok) throw std::runtime_error("model check failed"); }

int main() {
 std::array<std::uint8_t,16> bytes{};
 const std::uint32_t n=3;const std::uint64_t token=258;
 for(std::size_t i=0;i<4;++i) bytes[i]=static_cast<std::uint8_t>(n>>(8*i));
 for(std::size_t i=0;i<8;++i) bytes[8+i]=static_cast<std::uint8_t>(token>>(8*i));
 std::uint32_t decoded_n=0;std::uint64_t decoded_token=0;
 for(std::size_t i=0;i<4;++i) decoded_n|=static_cast<std::uint32_t>(bytes[i])<<(8*i);
 for(std::size_t i=0;i<8;++i) decoded_token|=static_cast<std::uint64_t>(bytes[8+i])<<(8*i);
 require(decoded_n==3 && decoded_token==258);
 for(std::size_t i=4;i<8;++i) require(bytes[i]==0);
 std::cout<<"size="<<bytes.size()<<" n="<<decoded_n<<" token="<<decoded_token<<'\n';
}

