#include #include #include #include #include typedef uint8_t ipack_t; struct input_info { const static constexpr inline auto width = input::COLS; const static constexpr inline auto height = input::ROWS; bool data[width][height]; constexpr bool operator()(size_t col, size_t row) const { return data[col][row]; } }; struct input_packed { const static constexpr inline auto width = input::COLS; const static constexpr inline auto height = input::ROWS / sizeof(ipack_t); ipack_t data[width][height]; constexpr ipack_t operator()(size_t w, size_t h) const { return data[w][h]; } }; static_assert(input::ROWS % sizeof(ipack_t)==0, "Cannot pack rows into ipack_t losslessly"); consteval input_info gen_input_bits() { input_info o; for(size_t i=0;i constexpr void set_bit(T& data, size_t bit, bool value = true) { //constexpr const auto BITS = CHAR_BIT * sizeof(T); T mask = T(1) << bit; if(!value && (data & mask)) // bit is set, unset it data ^= mask; else if(value) data |= mask; // set the bit } consteval input_packed pack_input(const input_info& in) { input_packed o; //size_t k=0; constexpr const auto PACKED_BITS = CHAR_BIT * sizeof(ipack_t); for(size_t j=0;j 0) { // XXX: This sets the bits in reverse order, but that doesn't matter for this exersize if(in(j, i)) set_bit(bit, nbits); } o.data[j][i / sizeof(ipack_t)] = bit; } return o; } consteval input_packed gen_input_packed() { return pack_input(gen_input_bits()); } int main() { auto p = gen_input_packed(); for(int i=0;i