| 1818 | |
| 1819 | template<typename Context, typename T> |
| 1820 | auto get_trie( |
| 1821 | Context const & context, symbol_parser<T> const & sym_parser) |
| 1822 | { |
| 1823 | using trie_t = text::trie_map<std::vector<char32_t>, T>; |
| 1824 | using result_type = std::pair<trie_t &, bool>; |
| 1825 | symbol_table_tries_t & symbol_table_tries = |
| 1826 | context.get_symbol_table_tries(); |
| 1827 | |
| 1828 | auto & [any, has_case_folded] = |
| 1829 | symbol_table_tries[(void *)&sym_parser.ref()]; |
| 1830 | |
| 1831 | bool const needs_case_folded = context.no_case_depth_; |
| 1832 | |
| 1833 | if (!any.has_value()) { |
| 1834 | any = trie_t{}; |
| 1835 | has_case_folded = false; |
| 1836 | trie_t & trie = *std::any_cast<trie_t>(&any); |
| 1837 | for (auto const & e : sym_parser.initial_elements()) { |
| 1838 | trie.insert(e.first | text::as_utf32, e.second); |
| 1839 | if (needs_case_folded) { |
| 1840 | trie.insert( |
| 1841 | case_fold_view(e.first | text::as_utf32), e.second); |
| 1842 | has_case_folded = true; |
| 1843 | } |
| 1844 | } |
| 1845 | return result_type(trie, has_case_folded); |
| 1846 | } else { |
| 1847 | trie_t & trie = *std::any_cast<trie_t>(&any); |
| 1848 | if (needs_case_folded && !has_case_folded) { |
| 1849 | trie_t new_trie = trie; |
| 1850 | for (auto && [key, value] : trie) { |
| 1851 | new_trie.insert( |
| 1852 | case_fold_view(key | text::as_utf32), value); |
| 1853 | } |
| 1854 | std::swap(new_trie, trie); |
| 1855 | } |
| 1856 | return result_type(trie, has_case_folded); |
| 1857 | } |
| 1858 | } |
| 1859 | |
| 1860 | template<typename Context, typename T> |
| 1861 | decltype(auto) get_pending_symtab_ops( |