For parsers implemented as state machines, a common pattern often emerges: with each subsequent byte, the parser either transitions to a new state or remains in the current state. To determine which of these scenarios applies to a given byte, you can employ a Look-Up Table (LUT) approach.
static constexpr std::array<uint8_t, 256> alphanumeric_lut{
/* 0x00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,