static void encode( state_type &state, CUIT &out, character_type c, int &encoded_code_units) { encoded_code_units = 0; using unsigned_code_unit_type = std::make_unsigned_t<code_unit_type>; using code_point_type = code_point_type_t<character_set_type_t<character_type>>; code_point_type cp{c.get_code_point()}; if (cp <= 0x0000007F) { *out++ = unsigned_code_unit_type(cp); ++encoded_code_units; } else if (cp <= 0x000007FF) { *out++ = unsigned_code_unit_type(0xC0 + ((cp >> 6) & 0x1F)); ++encoded_code_units; *out++ = unsigned_code_unit_type(0x80 + (cp & 0x3F)); ++encoded_code_units; } else if (cp <= 0x0000D7FF) {
static void encode_state_transition( state_type &state, CUIT &out, const state_transition_type &stt, int &encoded_code_units) { encoded_code_units = 0; using unsigned_code_unit_type = std::make_unsigned_t<code_unit_type>; if (stt.state_transition == state_transition_type::to_initial) { // Transition to initial state from any state. state.bom_read_or_written = false; state.endian = state_type::big_endian; } else if (! state.bom_read_or_written) { // In initial state. switch (stt.state_transition) { case state_transition_type::to_initial: // Handled above. break; case state_transition_type::to_bom_written: case state_transition_type::to_be_bom_written: *out++ = unsigned_code_unit_type(0xFE); ++encoded_code_units; *out++ = unsigned_code_unit_type(0xFF); ++encoded_code_units; state.endian = state_type::big_endian; break; case state_transition_type::to_le_bom_written: *out++ = unsigned_code_unit_type(0xFF); ++encoded_code_units; *out++ = unsigned_code_unit_type(0xFE); ++encoded_code_units; state.endian = state_type::little_endian; break; case state_transition_type::to_assume_bom_written: case state_transition_type::to_assume_be_bom_written: state.endian = state_type::big_endian; break; case state_transition_type::to_assume_le_bom_written: state.endian = state_type::little_endian; break; } state.bom_read_or_written = true; } else if (state.endian == state_type::big_endian) { // In BE BOM read or written state. if (stt.state_transition == state_transition_type::to_le_bom_written || stt.state_transition == state_transition_type::to_assume_le_bom_written) { throw text_encode_error("Invalid LE state transition"); } else { // to_initial handled above, the rest have no affect. } } else { // In BE BOM read or written state. if (stt.state_transition == state_transition_type::to_be_bom_written || stt.state_transition == state_transition_type::to_assume_be_bom_written) { throw text_encode_error("Invalid BE state transition"); } else { // to_initial handled above, the rest have no affect. } } }