1 // GENERATED FILE - DO NOT EDIT.
2 // Generated by gen_builtin_symbols.py using data from builtin_variables.json and
3 // builtin_function_declarations.txt.
4 //
5 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
6 // Use of this source code is governed by a BSD-style license that can be
7 // found in the LICENSE file.
8 //
9 // ImmutableString_ESSL_autogen.cpp: Wrapper for static or pool allocated char arrays, that are
10 // guaranteed to be valid and unchanged for the duration of the compilation. Implements
11 // mangledNameHash using perfect hash function from gen_builtin_symbols.py
12 
13 #include "compiler/translator/ImmutableString.h"
14 
operator <<(std::ostream & os,const sh::ImmutableString & str)15 std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str)
16 {
17     return os.write(str.data(), str.length());
18 }
19 
20 #if defined(_MSC_VER)
21 #    pragma warning(disable : 4309)  // truncation of constant value
22 #endif
23 
24 namespace
25 {
26 
27 constexpr int mangledkT1[] = {2945, 2683, 2770, 846,  391,  1674, 1234, 2709, 1724, 861,
28                               2597, 1086, 529,  604,  2702, 832,  1136, 208,  1157, 2304,
29                               1681, 2044, 1506, 2963, 1139, 2408, 670,  2371, 2597, 646,
30                               2268, 1625, 2720, 1706, 616,  2530, 2900, 2210, 2240, 2351};
31 constexpr int mangledkT2[] = {113,  977,  384,  111,  2361, 1452, 1892, 2449, 771,  1341,
32                               46,   2394, 1170, 2798, 253,  1063, 312,  2391, 340,  1539,
33                               2210, 2423, 2955, 2877, 420,  2348, 1259, 2836, 33,   2167,
34                               970,  1742, 686,  486,  2352, 1814, 1442, 3024, 2595, 1244};
35 constexpr int mangledkG[]  = {
36     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
37     0,    0,    0,    0,    0,    0,    2031, 0,    0,    2399, 0,    0,    0,    0,    0,    1578,
38     0,    0,    0,    0,    2822, 0,    0,    0,    0,    0,    805,  941,  0,    0,    0,    0,
39     0,    0,    0,    2436, 480,  0,    1248, 0,    0,    0,    0,    657,  0,    0,    0,    0,
40     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1755,
41     1756, 0,    491,  0,    0,    2602, 0,    0,    0,    0,    1895, 0,    0,    254,  0,    301,
42     1393, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2136, 0,    511,  2570, 0,
43     92,   0,    0,    1618, 0,    0,    0,    0,    0,    0,    1510, 0,    0,    0,    1121, 0,
44     911,  0,    0,    0,    0,    0,    0,    2636, 0,    0,    0,    0,    0,    714,  0,    0,
45     625,  0,    0,    778,  0,    0,    0,    957,  0,    0,    0,    2193, 0,    2686, 0,    0,
46     0,    1011, 0,    0,    1062, 0,    0,    0,    0,    1456, 2402, 0,    0,    0,    0,    0,
47     0,    628,  0,    0,    0,    0,    0,    1297, 0,    0,    0,    0,    0,    1265, 0,    0,
48     158,  0,    0,    0,    0,    0,    225,  0,    0,    2221, 0,    0,    2676, 2773, 523,  0,
49     0,    0,    0,    0,    477,  1322, 1194, 0,    0,    0,    0,    993,  0,    0,    0,    0,
50     0,    0,    0,    56,   0,    1165, 0,    294,  0,    0,    0,    901,  0,    0,    0,    0,
51     2057, 0,    0,    125,  0,    0,    0,    0,    0,    0,    0,    0,    0,    1809, 0,    0,
52     0,    118,  236,  1269, 0,    0,    1933, 0,    123,  0,    0,    0,    1266, 2037, 0,    1807,
53     0,    2748, 0,    0,    609,  0,    0,    0,    0,    0,    0,    0,    659,  0,    0,    0,
54     0,    0,    0,    0,    216,  0,    0,    0,    388,  0,    0,    2231, 0,    461,  0,    0,
55     0,    0,    0,    0,    0,    0,    2944, 0,    1250, 0,    2904, 0,    0,    0,    331,  508,
56     0,    1496, 0,    0,    1621, 0,    0,    0,    0,    961,  0,    0,    783,  2515, 1474, 2001,
57     0,    0,    57,   0,    1084, 0,    0,    0,    0,    0,    0,    0,    0,    0,    2685, 0,
58     0,    113,  0,    0,    0,    2626, 0,    1318, 0,    491,  96,   0,    0,    0,    0,    2323,
59     0,    0,    0,    0,    2266, 1217, 0,    0,    0,    34,   0,    719,  0,    0,    2426, 0,
60     1270, 0,    0,    2730, 2483, 2269, 247,  746,  27,   0,    0,    0,    1110, 0,    0,    2069,
61     490,  0,    0,    0,    0,    0,    0,    0,    2245, 1178, 0,    0,    0,    0,    0,    0,
62     2386, 2805, 86,   0,    0,    1572, 410,  823,  0,    0,    962,  0,    0,    0,    888,  2881,
63     0,    1140, 0,    0,    0,    0,    0,    0,    0,    0,    1203, 174,  0,    0,    0,    0,
64     612,  0,    0,    0,    195,  0,    0,    475,  0,    0,    0,    0,    0,    2402, 2484, 0,
65     0,    0,    0,    0,    0,    0,    393,  2711, 0,    0,    0,    657,  0,    0,    0,    0,
66     684,  0,    0,    0,    0,    0,    0,    160,  0,    0,    0,    1753, 0,    385,  0,    0,
67     361,  1626, 0,    0,    2301, 0,    1717, 0,    0,    0,    0,    1195, 626,  0,    0,    520,
68     3006, 0,    0,    1216, 0,    321,  351,  23,   0,    0,    0,    0,    0,    1007, 0,    0,
69     2874, 2764, 0,    0,    0,    758,  16,   0,    0,    0,    1500, 0,    0,    0,    0,    0,
70     0,    0,    584,  1919, 2200, 550,  0,    2583, 630,  0,    0,    0,    0,    2027, 0,    2682,
71     0,    1186, 469,  0,    0,    0,    0,    2304, 713,  0,    0,    0,    0,    0,    0,    430,
72     0,    2752, 1644, 1539, 640,  513,  0,    0,    1592, 0,    2933, 104,  687,  2303, 703,  0,
73     1415, 0,    0,    154,  914,  669,  0,    886,  1744, 0,    537,  1147, 0,    859,  0,    0,
74     0,    0,    0,    0,    1151, 541,  0,    2918, 760,  1829, 1275, 1291, 0,    0,    0,    0,
75     2118, 0,    2486, 0,    0,    206,  186,  0,    0,    0,    0,    2178, 0,    0,    0,    2020,
76     0,    0,    0,    0,    2078, 0,    1860, 0,    1374, 0,    2975, 1552, 2133, 1602, 1398, 0,
77     0,    0,    699,  0,    2783, 0,    0,    803,  0,    211,  664,  0,    0,    216,  0,    0,
78     0,    0,    378,  0,    0,    1110, 0,    1345, 2991, 0,    0,    599,  0,    866,  803,  438,
79     0,    326,  432,  0,    0,    265,  0,    0,    0,    1448, 0,    1814, 0,    1088, 474,  0,
80     3052, 0,    1960, 0,    1240, 0,    0,    314,  1324, 0,    0,    1359, 390,  356,  0,    2153,
81     183,  2987, 0,    218,  2022, 0,    0,    0,    1574, 787,  0,    0,    0,    0,    0,    503,
82     983,  612,  0,    0,    422,  33,   2749, 959,  2692, 0,    0,    0,    1421, 0,    2784, 52,
83     2147, 0,    457,  0,    467,  0,    368,  512,  2458, 0,    0,    1639, 0,    0,    0,    2576,
84     0,    0,    525,  0,    0,    0,    2957, 0,    0,    1247, 2801, 11,   2678, 0,    0,    0,
85     1549, 0,    0,    2462, 428,  0,    0,    1184, 2278, 0,    444,  0,    0,    0,    3041, 717,
86     0,    2122, 1853, 1564, 0,    0,    0,    2355, 2702, 71,   0,    398,  1150, 1835, 114,  0,
87     2663, 2881, 2231, 0,    844,  0,    413,  0,    0,    0,    0,    0,    0,    0,    1134, 1001,
88     0,    0,    0,    0,    0,    0,    0,    1056, 2826, 732,  1221, 1208, 0,    2605, 0,    0,
89     130,  0,    1691, 736,  0,    1935, 1878, 2187, 0,    1927, 0,    0,    276,  0,    2750, 272,
90     0,    0,    2696, 0,    23,   0,    0,    643,  0,    2886, 0,    1820, 0,    509,  588,  0,
91     1549, 670,  0,    0,    1559, 699,  0,    2431, 0,    1675, 731,  0,    0,    0,    2860, 0,
92     0,    0,    0,    0,    2987, 2264, 1359, 0,    0,    78,   0,    0,    0,    469,  639,  2634,
93     3050, 0,    259,  802,  592,  1413, 313,  0,    0,    0,    0,    1146, 0,    0,    432,  183,
94     0,    2119, 0,    0,    244,  2253, 2172, 1417, 0,    0,    1745, 0,    92,   0,    0,    130,
95     1273, 1330, 0,    1678, 0,    0,    449,  2320, 2011, 0,    2830, 0,    2076, 2234, 0,    0,
96     0,    50,   387,  0,    1099, 0,    1188, 0,    0,    0,    0,    130,  0,    716,  187,  0,
97     2769, 187,  395,  0,    0,    925,  1280, 0,    0,    906,  0,    615,  1267, 0,    1026, 0,
98     0,    0,    0,    0,    0,    2063, 2206, 899,  0,    1618, 0,    316,  0,    1088, 0,    2899,
99     2937, 0,    264,  0,    0,    1508, 116,  0,    2426, 0,    99,   0,    0,    2013, 2075, 0,
100     0,    2149, 1755, 1427, 191,  1262, 246,  0,    645,  865,  0,    1586, 1436, 2555, 0,    2405,
101     559,  652,  140,  0,    351,  0,    0,    2923, 251,  840,  0,    875,  89,   0,    1961, 850,
102     0,    0,    0,    0,    2872, 234,  0,    1674, 2171, 0,    0,    1292, 2186, 947,  118,  0,
103     1004, 0,    302,  1313, 0,    809,  2557, 1034, 2674, 2630, 0,    861,  0,    2111, 543,  2748,
104     2403, 2529, 848,  0,    285,  0,    961,  0,    510,  902,  235,  0,    0,    0,    1479, 0,
105     2994, 2236, 2363, 362,  0,    965,  0,    0,    0,    2298, 490,  459,  0,    2889, 0,    0,
106     0,    0,    1809, 0,    0,    1333, 0,    1778, 255,  0,    0,    449,  0,    1497, 0,    1543,
107     953,  1029, 0,    1408, 0,    2330, 0,    0,    0,    0,    1986, 0,    0,    884,  2692, 2514,
108     2832, 0,    2619, 613,  0,    1136, 0,    0,    1061, 1493, 1677, 0,    0,    0,    161,  32,
109     0,    3021, 638,  1384, 0,    0,    976,  1426, 0,    0,    502,  1462, 0,    2197, 0,    0,
110     1117, 0,    0,    2753, 2069, 0,    2715, 2308, 2008, 0,    474,  54,   27,   1195, 583,  2325,
111     231,  0,    0,    1978, 0,    0,    1716, 2344, 1264, 0,    218,  0,    2932, 2885, 0,    389,
112     2814, 0,    778,  1885, 1625, 0,    0,    0,    0,    2393, 0,    0,    0,    2547, 1033, 0,
113     1057, 0,    0,    0,    452,  1524, 871,  0,    1251, 0,    0,    137,  0,    2868, 2373, 319,
114     519,  0,    0,    1090, 0,    1037, 1593, 1206, 2368, 0,    1855, 2580, 0,    0,    0,    0,
115     955,  0,    2217, 1762, 0,    0,    1585, 0,    0,    0,    2138, 0,    0,    823,  1381, 0,
116     13,   0,    0,    0,    0,    0,    0,    720,  2696, 1882, 0,    0,    2039, 0,    1957, 0,
117     336,  0,    0,    2768, 0,    0,    1015, 2066, 1349, 0,    728,  0,    2780, 0,    915,  0,
118     0,    1143, 2496, 2031, 577,  0,    1683, 235,  2977, 0,    903,  0,    0,    0,    0,    0,
119     2974, 1870, 1407, 240,  0,    2779, 1919, 0,    2016, 0,    0,    546,  362,  0,    2764, 74,
120     0,    2634, 631,  2883, 1167, 0,    0,    0,    2523, 1067, 0,    0,    173,  2454, 0,    314,
121     3008, 0,    39,   1311, 235,  1140, 2200, 0,    1695, 0,    0,    101,  0,    0,    0,    0,
122     0,    836,  0,    179,  2315, 0,    589,  2691, 3011, 968,  1223, 1290, 0,    695,  0,    161,
123     1927, 505,  186,  1048, 0,    2586, 0,    2028, 2249, 0,    0,    0,    0,    0,    2354, 1287,
124     0,    0,    0,    2392, 800,  187,  0,    308,  0,    0,    0,    1851, 312,  0,    0,    1544,
125     260,  0,    0,    697,  25,   0,    1986, 392,  0,    0,    0,    833,  2599, 0,    2258, 0,
126     2903, 0,    2232, 708,  0,    665,  0,    2702, 1143, 0,    515,  1294, 0,    0,    61,   0,
127     1012, 1102, 1173, 1316, 141,  1695, 0,    799,  0,    0,    0,    0,    3018, 515,  1954, 0,
128     1231, 1583, 484,  0,    0,    0,    2992, 2818, 0,    0,    1491, 1279, 1016, 2595, 2609, 0,
129     2261, 0,    0,    0,    1956, 0,    0,    0,    65,   0,    687,  2198, 0,    0,    0,    875,
130     0,    1499, 2608, 0,    0,    0,    0,    272,  976,  0,    317,  0,    0,    2653, 2426, 1592,
131     2787, 2911, 0,    0,    1465, 0,    0,    1231, 979,  0,    1323, 0,    2387, 2499, 469,  1355,
132     0,    1035, 0,    305,  0,    0,    0,    1778, 1109, 0,    1200, 78,   1724, 2839, 598,  0,
133     198,  0,    1571, 0,    0,    0,    1504, 693,  0,    524,  0,    2192, 0,    2548, 0,    2171,
134     0,    2087, 1093, 1507, 36,   442,  2872, 793,  68,   0,    0,    1240, 0,    0,    1190, 674,
135     1163, 0,    2152, 0,    0,    0,    1615, 2281, 1616, 2555, 31,   0,    0,    0,    306,  0,
136     738,  0,    1408, 0,    0,    2662, 0,    0,    751,  0,    0,    3000, 551,  2524, 0,    387,
137     2578, 0,    0,    0,    374,  84,   2116, 0,    1203, 0,    168,  617,  678,  612,  0,    705,
138     924,  825,  2828, 2532, 357,  2259, 0,    1540, 0,    0,    268,  0,    301,  1886, 0,    0,
139     2049, 444,  0,    749,  0,    0,    0,    281,  0,    0,    1103, 2860, 2910, 0,    0,    0,
140     2579, 28,   468,  2572, 1248, 0,    714,  0,    2957, 966,  2026, 0,    2312, 1009, 2841, 52,
141     2355, 0,    0,    2089, 2087, 0,    0,    1632, 2103, 0,    530,  0,    0,    0,    0,    448,
142     290,  1197, 467,  2878, 0,    0,    0,    731,  0,    0,    0,    0,    1942, 923,  1034, 287,
143     1272, 981,  2939, 0,    0,    2649, 0,    0,    925,  0,    1095, 0,    0,    0,    1093, 0,
144     0,    0,    0,    0,    851,  2667, 0,    2179, 497,  0,    0,    0,    1612, 723,  0,    0,
145     2842, 948,  1858, 91,   882,  0,    398,  0,    1072, 1165, 0,    1576, 1728, 2193, 1498, 0,
146     818,  0,    0,    2898, 730,  0,    644,  2832, 0,    2371, 0,    2114, 0,    15,   250,  2777,
147     1993, 0,    0,    0,    1588, 1704, 3000, 0,    0,    901,  1945, 809,  0,    1537, 1064, 0,
148     2106, 649,  2864, 751,  376,  1529, 319,  1878, 0,    2448, 1348, 0,    46,   821,  681,  533,
149     0,    0,    588,  92,   0,    1553, 0,    1150, 0,    0,    1324, 0,    0,    431,  0,    495,
150     0,    803,  0,    68,   0,    463,  746,  0,    0,    0,    178,  1976, 1171, 1550, 2790, 0,
151     0,    0,    1513, 25,   0,    0,    571,  0,    1263, 1861, 262,  0,    0,    1737, 0,    2758,
152     0,    0,    518,  224,  158,  171,  1672, 0,    516,  553,  1229, 1388, 0,    0,    0,    2427,
153     127,  0,    1347, 553,  423,  2851, 0,    2755, 0,    347,  0,    0,    0,    0,    0,    0,
154     0,    614,  1039, 2960, 526,  0,    2211, 913,  785,  2336, 0,    303,  3017, 0,    0,    1820,
155     0,    1003, 0,    0,    0,    2142, 0,    0,    310,  1216, 0,    2346, 1893, 1427, 2546, 0,
156     1095, 2210, 1882, 2899, 2069, 722,  474,  2010, 2298, 0,    0,    496,  0,    0,    0,    873,
157     426,  2698, 0,    2628, 0,    1732, 1731, 15,   0,    1274, 279,  0,    0,    479,  0,    0,
158     1087, 0,    0,    2826, 0,    2712, 1354, 0,    640,  2719, 0,    1641, 42,   2395, 0,    2690,
159     2161, 0,    0,    0,    938,  0,    0,    925,  570,  2489, 0,    0,    1341, 33,   0,    0,
160     432,  295,  1217, 1623, 2221, 0,    0,    1665, 1236, 2110, 1183, 2644, 0,    1309, 2416, 729,
161     0,    1141, 908,  770,  0,    0,    1607, 693,  492,  62,   0,    1489, 0,    1243, 1001, 3001,
162     0,    0,    0,    2514, 0,    0,    2011, 0,    1060, 1418, 0,    785,  2191, 0,    1566, 0,
163     1128, 160,  241,  0,    1066, 1898, 312,  0,    1332, 0,    2100, 0,    1603, 1120, 1052, 1869,
164     0,    2944, 0,    2474, 0,    483,  0,    1596, 2255, 0,    2349, 2821, 719,  0,    248,  417,
165     0,    571,  0,    220,  0,    0,    3004, 0,    200,  0,    2568, 24,   1197, 76,   0,    529,
166     453,  2330, 2500, 0,    1527, 1282, 631,  450,  1507, 515,  0,    0,    682,  387,  568,  576,
167     549,  0,    0,    687,  0,    0,    370,  2987, 0,    0,    1180, 622,  203,  0,    267,  0,
168     381,  0,    515,  670,  40,   581,  335,  789,  2257, 0,    780,  0,    2326, 664,  2972, 138,
169     2489, 0,    1349, 347,  503,  0,    0,    208,  2159, 0,    0,    1493, 517,  0,    0,    0,
170     0,    0,    1370, 1795, 2017, 2390, 1522, 2492, 0,    1133, 2233, 0,    0,    0,    0,    0,
171     1012, 149,  2696, 2988, 585,  0,    1857, 1863, 2621, 0,    0,    906,  0,    0,    1537, 2721,
172     2185, 0,    2264, 57,   0,    0,    959,  411,  252,  377,  1132, 1484, 0,    0,    0,    213,
173     1707, 454,  1444, 0,    0,    937,  0,    0,    1760, 0,    908,  1442, 2069, 0,    810,  0,
174     2908, 0,    1582, 0,    2092, 216,  0,    1115, 620,  0,    293,  1202, 145,  683,  951,  0,
175     862,  0,    0,    0,    1409, 928,  1353, 374,  0,    343,  91,   0,    0,    0,    0,    502,
176     1694, 2,    161,  496,  0,    114,  1554, 972,  0,    0,    989,  1296, 508,  144,  824,  1210,
177     1133, 0,    0,    787,  0,    0,    795,  2132, 0,    0,    1602, 333,  0,    2297, 2939, 609,
178     1355, 443,  85,   784,  679,  889,  866,  1433, 2624, 0,    0,    0,    0,    0,    0,    2387,
179     532,  0,    0,    1527, 0,    631,  0,    0,    607,  0,    1271, 263,  795,  619,  0,    1652,
180     0,    875,  0,    1340, 1486, 318,  1288, 2278, 852,  538,  1201, 0,    388,  881,  0,    1374,
181     667,  0,    0,    2518, 1781, 0,    1289, 3040, 768,  0,    2999, 173,  1575, 1149, 0,    389,
182     840,  12,   0,    335,  1774, 1469, 1025, 0,    1063, 547,  1372, 1927, 320,  660,  1342, 1983,
183     376,  2495, 1572, 0,    1243, 0,    2931, 2588, 1205, 725,  0,    1196, 80,   1511, 0,    0,
184     217,  0,    1070, 0,    1112, 0,    0,    621,  1748, 2599, 0,    0,    204,  1856, 1599, 0,
185     0,    2266, 0,    1624, 2162, 0,    0,    757,  1254, 2714, 2575, 951,  0,    0,    404,  1572,
186     1502, 0,    1425, 2244, 1553, 292,  730,  54,   0,    0,    622,  3012, 554,  0,    1790, 25,
187     3022, 0,    2862, 0,    1632, 409,  0,    630,  675,  307,  1589, 2191, 0,    715,  1377, 0,
188     62,   0,    859,  99,   1418, 0,    1245, 472,  2767, 1518, 0,    0,    0,    0,    646,  0,
189     0,    664,  2543, 762,  2268, 0,    0,    514,  1066, 0,    1225, 0,    0,    1238, 0,    1814,
190     2873, 2985, 647,  803,  2962, 1198, 0,    0,    724,  1579, 2570, 2211, 0,    867,  1759, 1009,
191     472,  607,  10,   1506, 0,    0,    2535, 2,    773,  1561, 3035, 0,    451,  1318, 600,  1697,
192     1084, 334,  446,  311,  0,    2760, 1385, 962,  0,    1846, 0,    0,    0,    0,    0,    478,
193     325,  0,    2538, 675,  130,  0,    60,   1463, 0,    2306, 616,  0,    0,    1156, 43,   2497,
194     0,    0,    1261, 0,    2885, 1154, 308,  123,  1159, 1232, 67,   0,    2881, 2869, 470,  0,
195     786,  0,    817,  0,    0,    0,    0,    935,  0,    843,  0,    0,    474,  2495, 2100, 1430,
196     261,  2582, 3053, 1174, 0,    394,  0,    0,    0,    2085, 0,    0,    0,    0,    2958, 0,
197     0,    332,  1299, 372,  1371, 2956, 939,  1701, 0,    929,  2899, 1055, 1561, 683,  1532, 0,
198     451,  869,  0,    2618, 0,    1477, 2869, 0,    0,    598,  934,  1696, 2696, 1012, 2089, 0,
199     850,  2627, 0,    0,    1604, 183,  0,    0,    447,  0,    1584, 0,    355,  2695, 1598, 66,
200     2586, 2365, 1187, 0,    562,  2576, 864,  547,  655,  0,    0,    1521, 182,  1832, 1283, 95,
201     933,  270,  0,    2662, 0,    2598, 0,    0,    798,  0,    0,    0,    0,    0,    0,    1015,
202     2669, 0,    576,  742,  0,    0,    1503, 301,  1255, 2523, 0,    381,  0,    1550, 0,    399,
203     1166, 2011, 0,    1268, 2788, 0,    0,    0,    402,  0,    1040, 0,    703,  0,    0,    2636,
204     0,    0,    1443, 854,  811,  1068, 963,  58,   978,  0,    344,  1565, 0,    0,    2654, 0,
205     0,    540,  0,    514,  640,  0,    1298, 338,  0,    2945, 0,    1192, 0,    0,    1788, 0,
206     2004, 0,    2857, 1088, 588,  863,  2021, 0,    389,  805,  0,    1274, 624,  475,  0,    541,
207     1226, 0,    0,    722,  915,  0,    0,    1794, 2724, 3037, 1218, 0,    0,    2047, 830,  1558,
208     1192, 229,  243,  2452, 1353, 2813, 1407, 1891, 602,  0,    0,    895,  849,  0,    0,    3029,
209     29,   0,    1393, 0,    834,  0,    1158, 528,  1860, 266,  2860, 1374, 358,  1822, 0,    2664,
210     1076, 3053, 0,    1052, 21,   2114, 3011, 2630, 0,    0,    211,  838,  1014, 0,    0,    0,
211     0,    0,    0,    0,    0,    606,  2016, 391,  0,    127,  6,    391,  2226, 1119, 3052, 66,
212     2709, 2563, 209,  0,    1131, 2681, 1545, 2003, 1491, 292,  2833, 0,    0,    0,    0,    2876,
213     0,    768,  630,  1755, 483,  2017, 0,    1035, 1365, 0,    0,    396,  1313, 0,    2026, 0,
214     3042, 0,    0,    1471, 651,  1372, 76,   208,  1173, 558,  2560, 391,  2001, 2571, 0,    0,
215     0,    639,  0,    0,    494,  1497, 17,   141,  0,    119,  647,  955,  377,  2305, 365,  0,
216     1380, 0,    313,  2898, 2369, 319,  150,  643,  0,    0,    772,  856,  1313, 0,    0,    0,
217     0,    218,  0,    2296, 0,    765,  0,    2233, 1556, 683,  0,    1009, 382,  364,  15,   0,
218     209,  1347, 2109, 1404, 120,  371,  77,   0,    192,  163,  811,  316,  0,    0,    558,  0,
219     1487, 1092, 0,    1600, 1224, 0,    278,  0,    2629, 0,    682,  1121, 2856, 1298, 327,  0,
220     397,  1447, 1083, 0,    0,    1012, 2232, 0,    921,  2397, 0,    1495, 428,  323,  0,    189,
221     453,  2986, 837,  0,    0,    0,    247,  0,    2881, 999,  610,  0,    0,    1319, 0,    606,
222     0,    1569, 163,  1039, 1919, 2256, 0,    2400, 2371, 421,  1127, 1236, 98,   644,  1242, 1730,
223     1581, 0,    168,  0,    516,  0,    543,  314,  1038, 286,  0,    1145, 2148, 0,    481,  2531,
224     842,  0,    0,    0,    3,    0,    1338, 517,  1276, 2788, 707,  1211, 1580, 1842, 1054, 0,
225     0,    2663, 0,    0,    454,  324,  0,    0,    0,    1452, 0,    0,    1386, 1118, 969,  569,
226     1990, 2874, 0,    831,  0,    0,    633,  1480, 0,    2163, 778,  389,  1709, 9,    0,    363};
227 
MangledHashG(const char * key,const int * T)228 int MangledHashG(const char *key, const int *T)
229 {
230     int sum = 0;
231 
232     for (int i = 0; key[i] != '\0'; i++)
233     {
234         sum += T[i] * key[i];
235         sum %= 3056;
236     }
237     return mangledkG[sum];
238 }
239 
MangledPerfectHash(const char * key)240 int MangledPerfectHash(const char *key)
241 {
242     if (strlen(key) > 40)
243         return 0;
244 
245     return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 3056;
246 }
247 
248 constexpr int unmangledkT1[] = {4,   292, 232, 232, 193, 181, 196, 165, 183, 130, 89,  218, 121,
249                                 218, 281, 292, 91,  82,  127, 12,  101, 68,  202, 208, 9,   296};
250 constexpr int unmangledkT2[] = {45,  96,  273, 31,  160, 43,  51,  33,  186, 19, 295, 90, 177,
251                                 130, 293, 293, 260, 112, 117, 282, 224, 179, 56, 272, 36, 261};
252 constexpr int unmangledkG[]  = {
253     0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   78,  96,  41,  0,   0,   268,
254     0,   0,   0,   24,  0,   0,   0,   45,  6,   55,  0,   0,   0,   0,   199, 30,  146, 209,
255     0,   299, 0,   212, 0,   300, 106, 0,   40,  0,   0,   114, 0,   0,   5,   0,   0,   0,
256     58,  241, 38,  0,   54,  68,  64,  90,  64,  0,   0,   0,   0,   0,   76,  0,   183, 303,
257     0,   0,   0,   0,   51,  0,   0,   152, 0,   0,   92,  153, 0,   93,  0,   255, 125, 0,
258     141, 171, 0,   87,  299, 86,  1,   0,   0,   87,  5,   0,   79,  0,   262, 0,   110, 0,
259     32,  267, 0,   0,   100, 2,   0,   0,   0,   229, 248, 0,   77,  0,   0,   11,  215, 110,
260     0,   0,   269, 22,  199, 0,   37,  0,   0,   0,   202, 126, 65,  9,   0,   97,  104, 0,
261     0,   0,   0,   203, 0,   227, 84,  0,   25,  76,  0,   89,  0,   0,   9,   149, 0,   72,
262     41,  0,   0,   0,   94,  0,   0,   0,   0,   59,  139, 10,  292, 102, 58,  0,   0,   280,
263     14,  43,  105, 123, 33,  114, 223, 82,  142, 0,   175, 0,   4,   113, 67,  116, 0,   0,
264     242, 0,   96,  0,   130, 245, 29,  66,  279, 0,   89,  0,   293, 4,   93,  0,   40,  62,
265     0,   0,   49,  0,   294, 42,  277, 275, 0,   75,  0,   135, 299, 0,   217, 58,  47,  0,
266     106, 0,   0,   0,   54,  0,   242, 0,   0,   0,   50,  80,  24,  40,  9,   0,   120, 276,
267     0,   0,   0,   157, 0,   0,   0,   121, 167, 0,   84,  0,   22,  71,  0,   0,   292, 134,
268     27,  0,   274, 0,   0,   0,   51,  0,   128, 0,   0,   276, 0,   0,   0,   86,  273, 143,
269     0,   87,  242, 121, 185, 65,  252, 90,  188, 144, 104, 0,   94,  64,  1,   2,   21,  68};
270 
UnmangledHashG(const char * key,const int * T)271 int UnmangledHashG(const char *key, const int *T)
272 {
273     int sum = 0;
274 
275     for (int i = 0; key[i] != '\0'; i++)
276     {
277         sum += T[i] * key[i];
278         sum %= 306;
279     }
280     return unmangledkG[sum];
281 }
282 
UnmangledPerfectHash(const char * key)283 int UnmangledPerfectHash(const char *key)
284 {
285     if (strlen(key) > 26)
286         return 0;
287 
288     return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 306;
289 }
290 
291 }  // namespace
292 
293 namespace sh
294 {
295 
296 template <>
297 const size_t ImmutableString::FowlerNollVoHash<4>::kFnvPrime = 16777619u;
298 
299 template <>
300 const size_t ImmutableString::FowlerNollVoHash<4>::kFnvOffsetBasis = 0x811c9dc5u;
301 
302 template <>
303 const size_t ImmutableString::FowlerNollVoHash<8>::kFnvPrime =
304     static_cast<size_t>(1099511628211ull);
305 
306 template <>
307 const size_t ImmutableString::FowlerNollVoHash<8>::kFnvOffsetBasis =
308     static_cast<size_t>(0xcbf29ce484222325ull);
309 
mangledNameHash() const310 uint32_t ImmutableString::mangledNameHash() const
311 {
312     return MangledPerfectHash(data());
313 }
314 
unmangledNameHash() const315 uint32_t ImmutableString::unmangledNameHash() const
316 {
317     return UnmangledPerfectHash(data());
318 }
319 
320 }  // namespace sh
321