| 7814 | } |
| 7815 | |
| 7816 | void decompose(std::u32string& input, size_t additional_elements) { |
| 7817 | input.resize(input.size() + additional_elements); |
| 7818 | for (size_t descending_idx = input.size(), |
| 7819 | input_count = descending_idx - additional_elements; |
| 7820 | input_count--;) { |
| 7821 | if (input[input_count] >= hangul_sbase && |
| 7822 | input[input_count] < hangul_sbase + hangul_scount) { |
| 7823 | // Hangul decomposition. |
| 7824 | char32_t s_index = input[input_count] - hangul_sbase; |
| 7825 | if (s_index % hangul_tcount != 0) { |
| 7826 | input[--descending_idx] = hangul_tbase + s_index % hangul_tcount; |
| 7827 | } |
| 7828 | input[--descending_idx] = |
| 7829 | hangul_vbase + (s_index % hangul_ncount) / hangul_tcount; |
| 7830 | input[--descending_idx] = hangul_lbase + s_index / hangul_ncount; |
| 7831 | } else if (input[input_count] < 0x110000) { |
| 7832 | // Check decomposition_data. |
| 7833 | const uint16_t* decomposition = |
| 7834 | decomposition_block[decomposition_index[input[input_count] >> 8]] + |
| 7835 | (input[input_count] % 256); |
| 7836 | uint16_t decomposition_length = |
| 7837 | (decomposition[1] >> 2) - (decomposition[0] >> 2); |
| 7838 | if (decomposition_length > 0 && (decomposition[0] & 1)) { |
| 7839 | decomposition_length = 0; |
| 7840 | } |
| 7841 | if (decomposition_length > 0) { |
| 7842 | // Non-recursive decomposition. |
| 7843 | while (decomposition_length-- > 0) { |
| 7844 | input[--descending_idx] = decomposition_data[(decomposition[0] >> 2) + |
| 7845 | decomposition_length]; |
| 7846 | } |
| 7847 | } else { |
| 7848 | // No decomposition. |
| 7849 | input[--descending_idx] = input[input_count]; |
| 7850 | } |
| 7851 | } else { |
| 7852 | // Non-Unicode character. |
| 7853 | input[--descending_idx] = input[input_count]; |
| 7854 | } |
| 7855 | } |
| 7856 | } |
| 7857 | |
| 7858 | uint8_t get_ccc(char32_t c) noexcept { |
| 7859 | return c < 0x110000 ? canonical_combining_class_block |