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_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[] = {28,   3723, 1475, 371,  51,   3462, 1683, 2358, 3960, 3760,
28                               2533, 2942, 2587, 1686, 466,  832,  1198, 860,  3747, 824,
29                               946,  743,  1301, 3888, 1189, 1813, 3864, 248,  3590, 3448,
30                               1379, 196,  1988, 2577, 1764, 270,  376};
31 constexpr int mangledkT2[] = {2798, 3904, 2564, 1178, 3278, 628,  2610, 1987, 3024, 1954,
32                               2499, 12,   3392, 2914, 794,  3806, 3980, 2527, 3362, 3980,
33                               1226, 3423, 713,  1825, 1062, 1687, 1758, 3010, 2151, 2612,
34                               1189, 1755, 1372, 2634, 1830, 448,  2730};
35 constexpr int mangledkG[]  = {
36     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
37     639,  0,    0,    0,    3989, 0,    1769, 0,    634,  1890, 0,    0,    0,    145,  0,    0,
38     0,    0,    3626, 0,    0,    0,    0,    0,    2169, 0,    0,    0,    0,    1101, 0,    0,
39     0,    0,    0,    0,    0,    2836, 0,    391,  0,    0,    0,    0,    0,    0,    0,    0,
40     0,    0,    3962, 0,    0,    0,    2256, 1708, 0,    594,  0,    0,    0,    0,    0,    557,
41     0,    0,    1169, 825,  3786, 0,    0,    1963, 0,    0,    0,    0,    0,    0,    0,    0,
42     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3407, 0,
43     2374, 0,    0,    0,    0,    0,    3517, 1263, 0,    0,    1281, 989,  3862, 3496, 1810, 0,
44     3143, 0,    0,    0,    3285, 3588, 0,    0,    0,    0,    3089, 0,    1239, 553,  3392, 0,
45     2301, 0,    0,    0,    0,    0,    0,    0,    0,    3748, 0,    0,    0,    2584, 1570, 0,
46     1139, 0,    1034, 0,    0,    0,    0,    1335, 0,    1435, 0,    3637, 0,    0,    0,    58,
47     3114, 0,    0,    0,    2043, 0,    3169, 466,  0,    495,  3598, 0,    0,    0,    0,    3506,
48     4016, 0,    0,    0,    2056, 0,    303,  3319, 0,    0,    818,  1325, 0,    0,    0,    0,
49     3622, 0,    0,    189,  3689, 0,    1735, 0,    0,    804,  0,    0,    0,    0,    3379, 0,
50     1371, 0,    3740, 0,    0,    0,    3495, 0,    0,    0,    409,  0,    0,    0,    2608, 0,
51     1229, 722,  0,    1558, 1391, 3823, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
52     0,    3291, 1392, 0,    0,    228,  0,    0,    0,    0,    0,    0,    0,    0,    308,  0,
53     0,    0,    0,    0,    2436, 0,    0,    0,    743,  3009, 0,    642,  0,    0,    1176, 0,
54     0,    0,    1766, 0,    0,    0,    0,    0,    0,    0,    0,    287,  0,    0,    0,    0,
55     3422, 3236, 3990, 0,    0,    1347, 0,    0,    0,    832,  3240, 3588, 0,    0,    0,    0,
56     3033, 0,    0,    1365, 0,    0,    0,    0,    173,  3964, 0,    0,    0,    3589, 0,    0,
57     0,    3240, 332,  0,    1714, 3598, 2481, 0,    0,    0,    99,   0,    0,    0,    2221, 0,
58     3696, 0,    1195, 3618, 2753, 1278, 3651, 0,    0,    0,    3229, 0,    745,  0,    0,    1840,
59     0,    0,    1881, 0,    0,    0,    616,  0,    561,  3158, 1367, 0,    0,    0,    571,  416,
60     0,    0,    340,  3425, 1686, 286,  0,    3988, 2657, 0,    391,  280,  0,    0,    0,    0,
61     1019, 0,    0,    0,    0,    3375, 0,    0,    0,    2450, 0,    0,    776,  0,    2748, 0,
62     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    236,  0,    1143, 0,
63     0,    0,    0,    0,    2585, 3511, 0,    311,  0,    442,  0,    0,    0,    0,    1494, 0,
64     0,    0,    0,    0,    3472, 0,    0,    719,  2609, 0,    0,    0,    2108, 2572, 0,    928,
65     2589, 0,    168,  59,   3360, 3743, 502,  0,    2702, 1842, 0,    0,    0,    553,  1072, 2774,
66     1330, 1355, 1713, 0,    231,  855,  1471, 0,    129,  0,    3926, 0,    3734, 0,    0,    0,
67     0,    0,    0,    0,    0,    0,    3430, 0,    269,  2404, 0,    0,    0,    656,  0,    687,
68     360,  2159, 1443, 0,    1863, 0,    0,    0,    0,    0,    1185, 0,    390,  0,    0,    2571,
69     1704, 452,  1997, 0,    3368, 0,    0,    2868, 0,    0,    0,    0,    843,  1996, 477,  0,
70     3539, 1077, 3406, 0,    0,    544,  0,    780,  0,    0,    0,    0,    0,    0,    3816, 617,
71     0,    0,    0,    0,    706,  0,    0,    3204, 0,    462,  0,    0,    701,  3672, 0,    637,
72     0,    0,    3916, 0,    0,    0,    535,  0,    35,   1910, 0,    1463, 619,  0,    1041, 0,
73     0,    0,    0,    0,    3359, 0,    2912, 0,    0,    0,    1118, 0,    2513, 943,  0,    0,
74     79,   0,    0,    0,    3387, 0,    3520, 1663, 0,    0,    0,    3688, 0,    0,    0,    0,
75     3911, 1979, 0,    445,  0,    0,    847,  0,    0,    0,    0,    761,  491,  3991, 185,  0,
76     0,    2133, 0,    3499, 0,    0,    0,    0,    1014, 0,    1715, 0,    483,  0,    2580, 0,
77     0,    0,    2724, 0,    0,    0,    837,  1300, 0,    0,    0,    0,    0,    0,    0,    0,
78     0,    0,    3746, 0,    0,    1613, 3425, 3798, 845,  0,    0,    1921, 0,    0,    0,    0,
79     0,    2589, 3176, 1202, 0,    62,   3823, 4019, 3057, 0,    2992, 2406, 2078, 524,  0,    286,
80     768,  0,    0,    0,    0,    0,    0,    0,    380,  0,    0,    312,  2297, 0,    3737, 0,
81     0,    0,    3915, 0,    3185, 2581, 399,  0,    0,    1023, 3133, 2633, 85,   0,    2367, 0,
82     0,    1657, 0,    0,    1075, 0,    1061, 3206, 0,    3974, 3515, 0,    1056, 0,    0,    0,
83     0,    1204, 0,    3000, 453,  0,    967,  0,    0,    726,  0,    0,    2783, 0,    0,    75,
84     0,    0,    0,    3789, 14,   0,    2026, 2458, 3987, 2971, 0,    0,    1236, 3751, 0,    0,
85     0,    3143, 3506, 0,    115,  3261, 0,    1473, 996,  1203, 1625, 3678, 0,    3327, 2648, 0,
86     0,    0,    1830, 3346, 0,    0,    0,    0,    0,    0,    0,    0,    0,    3794, 734,  0,
87     395,  0,    2327, 0,    389,  0,    0,    0,    2024, 0,    0,    0,    439,  0,    0,    0,
88     699,  154,  3658, 0,    3555, 0,    0,    0,    3248, 0,    1783, 3,    0,    0,    0,    1721,
89     913,  58,   0,    3508, 0,    0,    0,    0,    0,    3651, 0,    1914, 0,    0,    0,    1176,
90     0,    0,    2994, 723,  3523, 0,    3619, 0,    500,  0,    2073, 0,    0,    0,    2883, 0,
91     0,    0,    2713, 0,    0,    0,    3322, 0,    0,    3167, 0,    0,    0,    2981, 0,    0,
92     0,    188,  0,    768,  0,    0,    537,  0,    3180, 2744, 222,  0,    0,    0,    0,    0,
93     268,  0,    618,  489,  664,  1437, 3201, 0,    0,    3166, 720,  0,    0,    0,    3125, 797,
94     0,    3427, 0,    0,    1697, 1760, 3215, 1007, 557,  4005, 3545, 41,   0,    0,    0,    1027,
95     0,    0,    346,  3645, 0,    1686, 0,    0,    2761, 967,  0,    3673, 0,    2700, 3365, 322,
96     2043, 2449, 3552, 0,    665,  658,  1131, 1526, 938,  0,    3002, 0,    0,    0,    0,    0,
97     3204, 0,    927,  131,  2262, 1069, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
98     0,    1073, 0,    0,    0,    1128, 3127, 606,  0,    1095, 2066, 0,    0,    0,    0,    3707,
99     370,  0,    0,    0,    0,    0,    0,    0,    1404, 1451, 0,    2882, 2569, 2081, 0,    162,
100     2918, 45,   0,    1175, 399,  0,    909,  1953, 0,    0,    528,  0,    0,    1133, 0,    0,
101     0,    3194, 3323, 3206, 2011, 0,    3918, 0,    0,    1787, 0,    0,    873,  0,    0,    3693,
102     0,    1983, 1079, 0,    0,    1862, 0,    0,    1621, 0,    2582, 0,    349,  0,    0,    3230,
103     1718, 0,    2553, 0,    507,  1543, 3773, 0,    0,    2090, 919,  0,    1466, 0,    0,    1953,
104     0,    0,    0,    1709, 0,    0,    0,    1155, 1946, 0,    172,  0,    1670, 0,    0,    3933,
105     3274, 180,  510,  3384, 0,    1191, 0,    0,    0,    1140, 3400, 1716, 0,    3703, 0,    0,
106     0,    0,    229,  0,    142,  0,    3459, 0,    0,    0,    0,    1036, 0,    1537, 0,    0,
107     0,    852,  34,   0,    0,    3691, 3536, 2301, 625,  1300, 0,    506,  660,  2455, 0,    4018,
108     1901, 1275, 0,    999,  1668, 1222, 0,    1220, 1905, 640,  669,  0,    0,    1157, 0,    2267,
109     0,    3032, 0,    3875, 0,    0,    757,  2063, 452,  0,    3812, 0,    1387, 0,    0,    316,
110     331,  257,  0,    0,    0,    0,    1647, 0,    0,    3829, 304,  3164, 409,  1777, 0,    0,
111     0,    0,    1472, 0,    0,    0,    0,    1024, 0,    2852, 0,    0,    0,    0,    0,    0,
112     1337, 524,  0,    1278, 953,  199,  1077, 3940, 0,    128,  2827, 3711, 0,    2401, 33,   0,
113     0,    2638, 1153, 1652, 2102, 1568, 580,  0,    3673, 2338, 0,    3514, 3335, 1898, 735,  0,
114     0,    0,    730,  0,    1417, 2484, 282,  0,    0,    0,    0,    0,    0,    1940, 0,    0,
115     1501, 1824, 0,    1689, 0,    0,    1,    659,  0,    713,  0,    3884, 0,    3954, 0,    0,
116     3805, 0,    0,    340,  0,    2925, 0,    3874, 3525, 168,  0,    0,    1259, 0,    0,    0,
117     772,  878,  695,  0,    1385, 1331, 0,    0,    0,    0,    0,    0,    2945, 1455, 886,  620,
118     1992, 0,    0,    0,    474,  0,    3408, 0,    0,    0,    0,    0,    2544, 81,   0,    0,
119     0,    2694, 0,    0,    0,    0,    0,    0,    23,   0,    0,    1487, 1305, 1609, 0,    0,
120     0,    2720, 670,  468,  0,    0,    2669, 775,  596,  2518, 240,  3417, 581,  1629, 2339, 1773,
121     3228, 0,    3507, 0,    230,  0,    352,  0,    1551, 0,    0,    683,  2302, 0,    364,  1638,
122     0,    2956, 244,  0,    496,  3113, 0,    0,    0,    0,    1951, 0,    623,  0,    4020, 1321,
123     0,    0,    0,    0,    1996, 958,  0,    1546, 1868, 0,    1190, 0,    3783, 0,    3032, 0,
124     1695, 0,    0,    0,    0,    0,    0,    2075, 0,    0,    0,    0,    2868, 2044, 0,    0,
125     2469, 0,    3864, 0,    2981, 0,    3018, 0,    3492, 0,    3670, 0,    2655, 0,    0,    122,
126     0,    0,    532,  0,    635,  1835, 3904, 0,    0,    0,    3026, 3431, 0,    0,    471,  1132,
127     1155, 1948, 1799, 1141, 2432, 0,    0,    0,    2077, 0,    1321, 0,    963,  0,    0,    1885,
128     0,    17,   0,    0,    1618, 376,  230,  3350, 492,  2179, 0,    1267, 1652, 2937, 721,  2035,
129     2882, 0,    0,    0,    1826, 1123, 0,    1099, 0,    150,  1088, 758,  0,    3285, 0,    0,
130     115,  0,    1895, 0,    1468, 0,    0,    0,    388,  0,    0,    0,    1627, 0,    3686, 3560,
131     214,  0,    0,    0,    0,    0,    3022, 784,  0,    0,    0,    2694, 0,    0,    3024, 0,
132     0,    0,    0,    0,    0,    1871, 330,  0,    0,    0,    123,  0,    333,  0,    2609, 0,
133     742,  0,    1375, 0,    143,  1186, 191,  0,    705,  0,    215,  1871, 0,    0,    1039, 2943,
134     345,  1685, 0,    0,    2887, 0,    0,    0,    364,  0,    833,  1317, 0,    468,  3159, 0,
135     3318, 0,    0,    1207, 3879, 1740, 0,    2986, 0,    246,  2514, 0,    0,    0,    0,    0,
136     0,    0,    991,  0,    1381, 0,    1622, 1590, 345,  0,    0,    728,  0,    0,    771,  0,
137     0,    0,    583,  244,  2133, 0,    0,    0,    1918, 0,    0,    1361, 1676, 1042, 0,    0,
138     0,    1924, 2454, 1357, 0,    482,  605,  0,    0,    0,    0,    666,  530,  0,    2388, 0,
139     680,  350,  22,   502,  1177, 3063, 0,    2804, 435,  0,    0,    0,    372,  0,    0,    1602,
140     302,  0,    3456, 0,    0,    1586, 947,  2828, 0,    3397, 101,  940,  0,    2546, 0,    320,
141     0,    2286, 1359, 0,    924,  754,  1792, 0,    0,    3472, 0,    666,  925,  2824, 274,  0,
142     262,  1304, 2526, 839,  1295, 0,    1830, 0,    1638, 88,   421,  0,    440,  413,  327,  0,
143     0,    898,  0,    2271, 1435, 0,    3651, 0,    2233, 714,  1329, 458,  544,  1603, 0,    0,
144     3180, 0,    0,    2276, 0,    280,  0,    0,    2982, 998,  0,    643,  1322, 2325, 2296, 0,
145     0,    0,    1860, 0,    0,    0,    0,    0,    0,    404,  0,    999,  1751, 1388, 0,    570,
146     1268, 0,    3843, 0,    0,    1019, 2163, 3488, 0,    0,    0,    0,    2365, 0,    46,   3092,
147     3446, 0,    373,  1059, 0,    1549, 2039, 0,    3466, 0,    1657, 0,    1178, 0,    888,  0,
148     1500, 442,  0,    0,    2087, 0,    0,    0,    2065, 1097, 0,    0,    2438, 0,    585,  387,
149     1631, 184,  0,    0,    293,  3954, 0,    1047, 1526, 0,    0,    0,    0,    2000, 0,    2775,
150     0,    1642, 235,  3671, 1727, 715,  3762, 2015, 0,    991,  0,    427,  0,    0,    0,    0,
151     0,    3002, 0,    844,  0,    0,    0,    217,  3686, 3249, 3741, 0,    1763, 0,    0,    0,
152     332,  2793, 2468, 3530, 826,  0,    0,    0,    0,    1873, 0,    0,    0,    3375, 909,  0,
153     1656, 854,  0,    0,    3326, 854,  71,   3695, 188,  1502, 0,    0,    827,  0,    0,    0,
154     0,    3489, 3969, 1537, 0,    0,    602,  0,    0,    751,  3016, 0,    0,    0,    0,    0,
155     7,    3902, 1764, 3674, 0,    3507, 3007, 0,    0,    2302, 3079, 1995, 947,  3503, 3352, 1242,
156     0,    1504, 1205, 0,    0,    3631, 0,    984,  1490, 0,    0,    1471, 3727, 1306, 1051, 3583,
157     74,   0,    82,   2206, 3322, 0,    0,    304,  1905, 0,    2365, 2984, 3200, 1636, 1137, 2851,
158     0,    795,  0,    685,  0,    3407, 647,  0,    1053, 0,    3202, 0,    1385, 734,  1996, 834,
159     2557, 574,  996,  1392, 0,    0,    1985, 324,  0,    2615, 0,    507,  817,  195,  0,    0,
160     0,    2626, 0,    1150, 0,    0,    743,  0,    775,  0,    615,  3188, 863,  0,    1451, 0,
161     3296, 0,    1133, 0,    579,  1174, 736,  2205, 1151, 1716, 0,    1965, 0,    0,    176,  1428,
162     774,  1146, 2880, 0,    0,    0,    839,  806,  0,    0,    0,    0,    456,  1578, 0,    0,
163     3023, 0,    0,    816,  2369, 1826, 0,    0,    3522, 0,    2551, 0,    1172, 59,   1000, 0,
164     783,  2193, 127,  481,  0,    0,    0,    0,    326,  792,  3825, 221,  0,    904,  3019, 408,
165     1600, 0,    2395, 0,    0,    0,    2701, 2301, 3013, 2166, 2673, 3171, 0,    0,    0,    0,
166     0,    1763, 0,    0,    0,    761,  912,  1845, 0,    0,    1362, 549,  0,    989,  3912, 0,
167     602,  730,  0,    1613, 0,    2662, 31,   86,   232,  0,    0,    0,    0,    1387, 0,    0,
168     874,  1908, 2056, 0,    897,  0,    0,    0,    1731, 2716, 971,  0,    1593, 498,  2647, 653,
169     0,    1440, 434,  0,    2713, 356,  3433, 0,    0,    0,    710,  3218, 3047, 1875, 1393, 1474,
170     0,    887,  2026, 1053, 2094, 0,    0,    0,    0,    0,    0,    0,    1873, 0,    1859, 928,
171     0,    0,    293,  1882, 0,    0,    1493, 2847, 0,    0,    2415, 0,    316,  2267, 837,  0,
172     561,  658,  3319, 2655, 1238, 2192, 123,  0,    1330, 1203, 0,    0,    3025, 1288, 2260, 770,
173     0,    3534, 767,  2854, 0,    1907, 1771, 0,    0,    3029, 1421, 0,    3463, 0,    0,    727,
174     1310, 3422, 1236, 745,  1397, 3497, 504,  1194, 3248, 861,  2535, 0,    1634, 0,    0,    1812,
175     2973, 0,    2372, 0,    0,    0,    0,    0,    3940, 1210, 0,    0,    0,    1512, 0,    0,
176     1607, 899,  0,    3590, 0,    0,    0,    0,    0,    102,  0,    0,    1702, 3513, 1211, 1746,
177     222,  2894, 631,  0,    0,    3317, 0,    0,    1525, 2109, 3766, 1233, 0,    233,  1538, 1661,
178     898,  2825, 0,    0,    941,  0,    0,    0,    516,  0,    611,  0,    0,    859,  0,    1001,
179     2597, 0,    0,    0,    0,    1688, 0,    0,    0,    0,    1076, 0,    3326, 894,  74,   444,
180     3779, 1995, 3249, 113,  3998, 0,    0,    604,  0,    0,    1077, 1516, 1750, 1302, 0,    3676,
181     0,    0,    0,    0,    1097, 0,    1098, 2570, 1489, 0,    2960, 0,    3767, 323,  0,    1580,
182     1382, 0,    0,    2195, 0,    0,    2225, 1268, 1815, 0,    192,  0,    0,    0,    2183, 290,
183     359,  0,    2946, 0,    1584, 288,  2338, 0,    1893, 1619, 0,    1516, 415,  0,    0,    0,
184     0,    3375, 836,  1220, 0,    0,    3968, 0,    0,    0,    1112, 1984, 467,  2890, 0,    0,
185     2006, 3484, 0,    2187, 1682, 371,  2264, 3088, 924,  985,  0,    0,    0,    1035, 147,  3525,
186     250,  2598, 128,  1110, 2120, 0,    3091, 0,    0,    0,    0,    0,    400,  574,  0,    477,
187     0,    0,    3820, 0,    3832, 2194, 475,  2732, 0,    0,    941,  0,    0,    1975, 0,    0,
188     0,    2021, 0,    0,    1951, 1427, 870,  1516, 588,  2952, 3441, 0,    496,  0,    782,  0,
189     692,  3,    866,  1136, 313,  672,  0,    1262, 3262, 2669, 0,    716,  994,  0,    1449, 1588,
190     0,    0,    0,    0,    171,  1094, 0,    633,  3489, 595,  2117, 0,    1797, 1676, 808,  0,
191     0,    0,    0,    1260, 0,    0,    1533, 0,    3734, 3356, 344,  748,  0,    3317, 1804, 0,
192     1374, 0,    1523, 3383, 1050, 429,  2565, 1047, 2193, 0,    1380, 2517, 3143, 514,  0,    0,
193     3999, 2604, 0,    3399, 2080, 0,    0,    1567, 0,    1691, 763,  0,    2130, 2674, 0,    1229,
194     0,    0,    0,    1333, 0,    1847, 0,    0,    1111, 0,    0,    141,  3630, 0,    0,    1838,
195     1839, 0,    2905, 2380, 0,    874,  0,    2307, 0,    0,    906,  0,    1080, 0,    119,  1876,
196     3868, 0,    0,    0,    1000, 499,  0,    0,    55,   781,  3828, 0,    0,    2079, 1177, 2365,
197     0,    0,    239,  2310, 72,   644,  884,  2436, 8,    1466, 1377, 135,  1383, 0,    737,  0,
198     0,    0,    3843, 3767, 0,    703,  1737, 1676, 732,  2077, 0,    0,    1420, 910,  1148, 295,
199     3553, 884,  0,    1496, 1919, 1201, 0,    0,    385,  1385, 857,  2422, 805,  0,    3311, 419,
200     3122, 1191, 0,    1632, 1964, 1231, 0,    0,    1427, 0,    0,    1196, 1829, 1486, 211,  0,
201     1434, 0,    0,    0,    1024, 0,    0,    0,    0,    2012, 0,    2838, 1788, 2981, 0,    2644,
202     0,    554,  3956, 592,  165,  2866, 0,    0,    161,  0,    0,    4020, 1663, 0,    0,    0,
203     0,    222,  0,    2281, 901,  0,    3955, 1208, 1130, 197,  1913, 0,    24,   3783, 0,    0,
204     1069, 0,    974,  0,    2754, 0,    1182, 0,    661,  3477, 2007, 0,    2882, 0,    643,  3412,
205     0,    3698, 0,    782,  3085, 30,   0,    0,    2020, 925,  0,    460,  521,  472,  0,    276,
206     892,  0,    0,    1112, 477,  0,    1241, 0,    834,  3832, 0,    0,    1170, 0,    0,    964,
207     4013, 2536, 0,    793,  43,   3455, 869,  0,    2271, 2775, 2780, 0,    1570, 0,    1793, 1562,
208     3715, 0,    3316, 488,  3666, 3126, 773,  913,  2188, 1999, 0,    207,  3621, 2074, 1338, 3773,
209     2038, 1047, 538,  0,    0,    3302, 3342, 1244, 0,    0,    0,    0,    292,  0,    3159, 0,
210     1359, 942,  0,    0,    0,    1343, 0,    0,    1814, 1015, 0,    1271, 1971, 0,    0,    3671,
211     0,    0,    0,    0,    0,    0,    1059, 0,    0,    3156, 2039, 0,    1187, 0,    0,    3534,
212     1123, 3522, 1498, 2434, 2894, 1810, 1523, 711,  467,  0,    0,    0,    3191, 1639, 2043, 1604,
213     760,  2138, 0,    1852, 0,    0,    2676, 3705, 2571, 0,    3545, 1671, 1802, 0,    0,    704,
214     0,    0,    0,    692,  61,   0,    310,  3856, 2564, 565,  0,    0,    504,  1251, 2170, 3452,
215     3396, 3101, 566,  213,  2406, 3646, 3744, 1817, 0,    1087, 0,    3900, 2071, 0,    337,  679,
216     1624, 923,  0,    0,    0,    3192, 1419, 0,    2963, 0,    0,    342,  3253, 0,    1694, 1556,
217     1296, 0,    0,    0,    2498, 1160, 824,  1610, 0,    0,    0,    275,  0,    3964, 3032, 2090,
218     1319, 2833, 556,  1313, 0,    2045, 3841, 0,    2825, 1572, 1903, 465,  0,    0,    0,    2292,
219     0,    0,    706,  0,    1258, 0,    0,    0,    1666, 113,  361,  1062, 0,    0,    0,    2078,
220     350,  683,  120,  0,    0,    0,    0,    1571, 0,    0,    0,    1223, 0,    970,  3641, 0,
221     0,    0,    0,    0,    651,  79,   3953, 0,    0,    0,    3176, 0,    1888, 3999, 1370, 0,
222     3115, 0,    1478, 1733, 0,    143,  2020, 0,    1784, 0,    3804, 0,    0,    0,    2497, 0,
223     0,    3758, 0,    1974, 0,    0,    0,    988,  827,  0,    1221, 1581, 0,    1697, 3718, 0,
224     0,    0,    0,    3462, 1777, 0,    0,    0,    3747, 459,  492,  0,    0,    0,    3515, 0,
225     2754, 3266, 3651, 0,    3440, 0,    194,  1151, 2823, 0,    1169, 1823, 2888, 0,    1396, 0,
226     3110, 3416, 783,  919,  135,  0,    0,    0,    173,  0,    0,    0,    1623, 235,  3170, 2701,
227     2767, 3232, 117,  3821, 0,    0,    3167, 0,    1627, 0,    0,    1899, 299,  0,    0,    0,
228     0,    3903, 1125, 0,    211,  2381, 3281, 3245, 1986, 0,    0,    0,    1434, 1480, 1937, 751,
229     1813, 3941, 3132, 3627, 239,  129,  545,  0,    2299, 3244, 932,  0,    1287, 1888, 3139, 1881,
230     3259, 0,    183,  207,  0,    578,  1498, 0,    0,    282,  2237, 959,  1558, 1824, 0,    0,
231     0,    0,    2725, 2136, 359,  0,    1228, 0,    1232, 0,    712,  3543, 3420, 0,    0,    0,
232     2148, 0,    0,    16,   0,    893,  3703, 0,    0,    0,    569,  2389, 914,  0,    3497, 2681,
233     86,   0,    0,    0,    0,    0,    2709, 201,  1108, 1488, 2033, 3653, 102,  0,    0,    0,
234     1230, 0,    509,  0,    0,    349,  414,  2385, 3932, 0,    844,  3971, 1346, 3504, 703,  1739,
235     1554, 0,    0,    0,    818,  1642, 9,    1090, 2711, 1503, 542,  0,    1292, 1392, 1240, 3638,
236     0,    0,    420,  518,  1358, 876,  0,    0,    1749, 4006, 1740, 3392, 1200, 0,    0,    0,
237     0,    1697, 1659, 0,    1265, 276,  0,    0,    0,    0,    898,  1961, 0,    0,    0,    166,
238     234,  1477, 1935, 2676, 0,    888,  3405, 2636, 1825, 1966, 1192, 161,  0,    445,  884,  0,
239     1278, 0,    2604, 560,  1464, 0,    0,    2565, 2087, 460,  1889, 0,    2310, 1354, 0,    2503,
240     0,    1812, 1949, 0,    0,    636,  176,  2903, 1081, 0,    0,    1156, 3930, 0,    1090, 422,
241     1746, 309,  0,    474,  0,    1801, 100,  0,    18,   0,    1043, 1942, 0,    0,    36,   1969,
242     1606, 1045, 1067, 869,  1391, 3768, 2285, 0,    252,  414,  0,    587,  3908, 0,    3402, 3341,
243     1056, 0,    0,    0,    605,  0,    1075, 52,   2122, 0,    3998, 1017, 3265, 0,    0,    1980,
244     0,    1351, 0,    940,  1715, 85,   1551, 0,    2884, 2849, 0,    1118, 0,    1515, 0,    0,
245     515,  1737, 0,    1187, 1594, 1304, 0,    1080, 3888, 0,    1065, 0,    0,    0,    1479, 0,
246     3477, 1690, 35,   0,    1709, 0,    3827, 566,  0,    1986, 2721, 0,    1556, 1443, 3970, 2814,
247     2155, 0,    1540, 0,    3570, 3224, 0,    0,    3756, 3105, 1359, 176,  1408, 1946, 1334, 1297,
248     2031, 2680, 3954, 515,  631,  2797, 726,  532,  2283, 0,    603,  0,    2053, 982,  1342, 0,
249     2261, 999,  0,    1086, 0,    671,  0,    0,    1710, 0,    0,    2137, 2965, 297,  453,  2376,
250     1441, 2694, 460,  1550, 3562, 3662, 3967, 740,  0,    44,   0,    0,    1158, 0,    1243, 0,
251     3190, 1590, 2649, 0,    384,  0,    0,    537,  1444, 2887, 2274, 624,  3931, 562,  1129, 0,
252     968,  806,  1073, 0,    0,    2426, 1526, 81,   662,  2025, 1565, 0,    0,    612,  220,  0,
253     756,  0,    979,  0,    1778, 1105, 0,    3591, 3838, 0,    0,    0,    1231, 2707, 3269, 0,
254     0,    0,    0,    0,    893,  0,    238,  3866, 1400, 669,  710,  0,    3593, 1800, 0,    0,
255     1596, 0,    590,  1483, 0,    335,  2667, 0,    1506, 0,    751,  1656, 12,   0,    1670, 3962,
256     3716, 0,    0,    199,  1026, 0,    484,  0,    0,    0,    0,    1318, 1307, 1818, 3331, 425,
257     935,  205,  0,    3609, 1985, 2055, 0,    1518, 1036, 991,  1264, 3230, 879,  2781, 1466, 178,
258     2969, 0,    918,  1430, 0,    0,    0,    0,    3951, 154,  156,  2405, 0,    696,  0,    0,
259     1433, 0,    770,  0,    945,  1858, 0,    0,    747,  1908, 0,    1339, 0,    1267, 0,    0,
260     0,    0,    0,    1070, 0,    1908, 2668, 0,    2320, 1081, 2337, 0,    0,    1303, 0,    2088,
261     690,  2035, 0,    225,  1173, 0,    13,   237,  1329, 0,    536,  1432, 86,   3591, 2933, 1949,
262     0,    722,  3951, 0,    0,    20,   655,  3734, 1995, 580,  0,    0,    0,    3598, 3963, 0,
263     3048, 2762, 0,    3436, 3001, 3780, 995,  0,    880,  3269, 1597, 869,  0,    3329, 986,  729,
264     0,    711,  0,    926,  3975, 1870, 0,    0,    1303, 312,  329,  1259, 0,    1233, 3990, 1356,
265     344,  0,    3701, 0,    3902, 0,    1364, 0,    0,    0,    2051, 385,  0,    0,    2232, 0,
266     0,    181,  1607, 3883, 1565, 0,    2111, 1506, 0,    0,    0,    0,    2022, 0,    3832, 0,
267     3596, 0,    1945, 1957, 1805, 1482, 3996, 3426, 266,  2114, 652,  0,    407,  1835, 1499, 2095,
268     1637, 1690, 2134, 0,    0,    0,    658,  1598, 2171, 0,    0,    0,    1628, 0,    365,  3169,
269     245,  977,  0,    0,    0,    1101, 3365, 1626, 2555, 2041, 2816, 0,    0,    898,  1309, 2692,
270     3795, 604,  594,  2840, 1930, 3968, 2128, 0,    943,  1972, 1114, 0,    119,  0,    2945, 3516,
271     2200, 3310, 0,    0,    453,  2788, 1064, 0,    0,    1700, 791,  1818, 0,    123,  0,    2124,
272     1031, 1645, 0,    1263, 0,    0,    1108, 0,    3436, 0,    274,  1394, 720,  0,    0,    0,
273     833,  0,    0,    0,    0,    0,    3425, 1818, 1515, 0,    0,    2894, 0,    2901, 0,    1999,
274     1699, 0,    2529, 1199, 2024, 0,    0,    272,  2583, 0,    2900, 3332, 2018, 820,  3395, 0,
275     0,    0,    2066, 0,    1136, 3784, 3739, 345,  0,    1241, 363,  0,    0,    3584, 519,  986,
276     0,    0,    1521, 0,    0,    3112, 0,    117,  0,    0,    2799, 155,  3937, 449,  3970, 79,
277     0,    3989, 0,    0,    2678, 2121, 3104, 0,    0,    842,  2820, 0,    1744, 3316, 0,    1531,
278     1304, 807,  0,    0,    266,  0,    3355, 0,    3301, 0,    362,  1335, 2051, 700,  0,    798,
279     2449, 2927, 0,    0,    1171, 0,    1406, 2140, 980,  1208, 260,  0,    0,    0,    3867, 774,
280     1993, 0,    0,    0,    298,  0,    1922, 275,  2473, 0,    112,  0,    1002, 2985, 3527, 1860,
281     0,    0,    3477, 0,    2168, 0,    4014, 2355, 2489, 1669, 899,  0,    3764, 2568, 3985, 0,
282     5,    1573, 0,    1654, 3474, 1507, 790,  1389, 0,    0,    301,  209,  687,  2057, 271,  1496,
283     302,  0,    287,  0,    1529, 1353, 0,    0,    0,    2452, 912,  2152, 240,  0,    0,    0,
284     0,    3258, 139,  1593, 2314, 0,    0,    1921, 3918, 141,  0,    1962, 1188, 0,    106,  0,
285     2686, 0,    3260, 3800, 1119, 0,    2097, 2623, 3684, 0,    393,  3188, 1029, 3345, 2540, 2796,
286     1458, 2377, 1349, 0,    0,    3698, 0,    1860, 521,  248,  548,  1599, 0,    1747, 902,  3,
287     0,    1883, 0,    2009, 713,  2002};
288 
MangledHashG(const char * key,const int * T)289 int MangledHashG(const char *key, const int *T)
290 {
291     int sum = 0;
292 
293     for (int i = 0; key[i] != '\0'; i++)
294     {
295         sum += T[i] * key[i];
296         sum %= 4022;
297     }
298     return mangledkG[sum];
299 }
300 
MangledPerfectHash(const char * key)301 int MangledPerfectHash(const char *key)
302 {
303     if (strlen(key) > 37)
304         return 0;
305 
306     return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 4022;
307 }
308 
309 constexpr int unmangledkT1[] = {144, 106, 306, 148, 131, 219, 212, 45,  287, 341, 277, 20,  111,
310                                 58,  208, 119, 14,  175, 302, 100, 209, 295, 267, 0,   229, 180};
311 constexpr int unmangledkT2[] = {121, 122, 34, 65,  319, 69,  163, 60, 246, 67,  291, 196, 119,
312                                 224, 117, 41, 360, 309, 210, 88,  98, 242, 241, 278, 10,  1};
313 constexpr int unmangledkG[]  = {
314     0,   0,   0,   0,   169, 0,   213, 0,   0,   147, 0,   364, 0,   83,  271, 0,   0,   0,   0,
315     26,  0,   190, 0,   0,   0,   0,   0,   84,  6,   0,   0,   47,  0,   0,   171, 0,   36,  74,
316     236, 0,   82,  0,   0,   0,   65,  189, 121, 0,   0,   0,   3,   65,  244, 37,  317, 71,  327,
317     0,   133, 0,   73,  0,   337, 0,   0,   77,  0,   0,   98,  0,   0,   45,  0,   41,  0,   51,
318     339, 23,  0,   0,   240, 0,   0,   0,   0,   0,   186, 0,   0,   0,   103, 42,  184, 0,   0,
319     350, 0,   82,  25,  105, 61,  0,   0,   119, 0,   69,  177, 0,   360, 344, 0,   0,   0,   0,
320     157, 0,   41,  0,   0,   0,   0,   87,  313, 0,   14,  12,  0,   0,   0,   175, 286, 0,   0,
321     120, 0,   111, 0,   0,   0,   0,   291, 0,   188, 270, 307, 356, 0,   5,   54,  130, 20,  47,
322     123, 0,   149, 308, 120, 39,  165, 351, 131, 0,   52,  110, 95,  88,  172, 0,   98,  0,   169,
323     67,  0,   93,  321, 13,  1,   178, 0,   248, 51,  0,   63,  189, 157, 0,   134, 299, 0,   0,
324     0,   130, 19,  0,   141, 0,   0,   186, 287, 184, 0,   314, 0,   352, 63,  109, 49,  0,   276,
325     0,   0,   19,  285, 202, 128, 0,   54,  287, 19,  74,  0,   0,   86,  75,  29,  122, 27,  37,
326     1,   0,   0,   353, 98,  0,   94,  136, 207, 30,  30,  107, 175, 0,   0,   0,   22,  0,   24,
327     2,   20,  300, 0,   0,   265, 0,   0,   0,   169, 95,  93,  15,  94,  241, 94,  6,   0,   0,
328     0,   332, 283, 0,   131, 299, 2,   0,   127, 0,   0,   296, 183, 0,   0,   276, 0,   150, 163,
329     133, 112, 0,   332, 245, 192, 0,   0,   15,  56,  0,   0,   37,  125, 0,   0,   0,   15,  142,
330     0,   0,   0,   0,   50,  0,   0,   348, 0,   111, 0,   37,  52,  67,  260, 90,  98,  176, 31,
331     0,   175, 24,  0,   158, 0,   0,   75,  108, 128, 60,  0,   107, 106, 0,   0,   59,  317, 0,
332     17,  132, 0,   203, 0,   0,   0,   91,  50,  15,  62,  0,   129, 0,   0,   168, 267, 0,   261,
333     200, 0,   73,  0};
334 
UnmangledHashG(const char * key,const int * T)335 int UnmangledHashG(const char *key, const int *T)
336 {
337     int sum = 0;
338 
339     for (int i = 0; key[i] != '\0'; i++)
340     {
341         sum += T[i] * key[i];
342         sum %= 365;
343     }
344     return unmangledkG[sum];
345 }
346 
UnmangledPerfectHash(const char * key)347 int UnmangledPerfectHash(const char *key)
348 {
349     if (strlen(key) > 26)
350         return 0;
351 
352     return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 365;
353 }
354 
355 }  // namespace
356 
357 namespace sh
358 {
359 
360 template <>
361 const size_t ImmutableString::FowlerNollVoHash<4>::kFnvPrime = 16777619u;
362 
363 template <>
364 const size_t ImmutableString::FowlerNollVoHash<4>::kFnvOffsetBasis = 0x811c9dc5u;
365 
366 template <>
367 const size_t ImmutableString::FowlerNollVoHash<8>::kFnvPrime =
368     static_cast<size_t>(1099511628211ull);
369 
370 template <>
371 const size_t ImmutableString::FowlerNollVoHash<8>::kFnvOffsetBasis =
372     static_cast<size_t>(0xcbf29ce484222325ull);
373 
mangledNameHash() const374 uint32_t ImmutableString::mangledNameHash() const
375 {
376     return MangledPerfectHash(data());
377 }
378 
unmangledNameHash() const379 uint32_t ImmutableString::unmangledNameHash() const
380 {
381     return UnmangledPerfectHash(data());
382 }
383 
384 }  // namespace sh
385