Edit

kc3-lang/angle/src/compiler/translator/ImmutableString_ESSL_autogen.cpp

Branch :

  • Show log

    Commit

  • Author : Mohan Maiya
    Date : 2020-11-19 07:58:05
    Hash : 8a401051
    Message : Vulkan: Support OES_sample_variables extension Enable OES_sample_variables extension on Vulkan backend. Add support for built-in variables, uniform state and constants - gl_SampleId, gl_SamplePosition, gl_SampleMask, gl_SampleMaskIn - gl_NumSamples - gl_MaxSamples Bug: angleproject:3588 Tests: dEQP-GLES31.functional.shaders.sample_variables.* KHR-GLES31.core.sample_variables.* Change-Id: Idf37c7b4ccb0331dbda7acd6389ff4e1022ba959 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2477907 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>

  • src/compiler/translator/ImmutableString_ESSL_autogen.cpp
  • // GENERATED FILE - DO NOT EDIT.
    // Generated by gen_builtin_symbols.py using data from builtin_variables.json and
    // builtin_function_declarations.txt.
    //
    // Copyright 2020 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    // ImmutableString_ESSL_autogen.cpp: Wrapper for static or pool allocated char arrays, that are
    // guaranteed to be valid and unchanged for the duration of the compilation. Implements
    // mangledNameHash using perfect hash function from gen_builtin_symbols.py
    
    #include "compiler/translator/ImmutableString.h"
    
    std::ostream &operator<<(std::ostream &os, const sh::ImmutableString &str)
    {
        return os.write(str.data(), str.length());
    }
    
    #if defined(_MSC_VER)
    #    pragma warning(disable : 4309)  // truncation of constant value
    #endif
    
    namespace
    {
    
    constexpr int mangledkT1[] = {1047, 528,  798,  265,  2913, 1389, 2657, 2604, 434,  2688,
                                  187,  3001, 2420, 3073, 2197, 724,  599,  2558, 2467, 1772,
                                  404,  210,  877,  3007, 3129, 1508, 1082, 2230, 2366, 541,
                                  646,  2655, 565,  472,  1414, 3109, 3027, 1657, 830,  1330};
    constexpr int mangledkT2[] = {693,  1478, 677,  2691, 2790, 1036, 2163, 673,  2138, 2411,
                                  527,  780,  228,  3008, 3095, 1436, 2168, 2249, 310,  3044,
                                  760,  776,  2946, 1280, 551,  715,  2699, 2899, 2007, 2353,
                                  3017, 1607, 1755, 3169, 1999, 1169, 1112, 2052, 2765, 906};
    constexpr int mangledkG[]  = {
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1631, 0,    451,  0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2084, 0,    0,    2545, 0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    1138, 0,    96,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    1404, 0,    0,    0,    2285, 0,    0,
        0,    2198, 0,    0,    0,    0,    0,    0,    0,    0,    0,    2070, 0,    0,    1240, 0,
        0,    0,    0,    377,  0,    200,  0,    958,  2993, 2792, 0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    459,  3114, 0,    0,    0,    0,    43,   0,    884,
        0,    0,    0,    716,  2991, 47,   0,    0,    0,    0,    1665, 0,    1789, 0,    0,    0,
        0,    0,    0,    1201, 0,    0,    0,    0,    0,    0,    0,    0,    0,    549,  0,    0,
        0,    0,    0,    0,    0,    0,    1852, 0,    0,    1157, 0,    335,  0,    214,  1976, 0,
        0,    684,  0,    0,    201,  1830, 735,  0,    0,    0,    0,    186,  523,  239,  1060, 0,
        0,    729,  893,  0,    887,  91,   0,    3104, 0,    0,    956,  0,    0,    0,    0,    0,
        0,    1514, 803,  0,    304,  0,    0,    0,    0,    0,    0,    1694, 0,    0,    0,    0,
        1387, 0,    0,    0,    1670, 0,    0,    3169, 0,    2696, 0,    348,  0,    0,    2448, 0,
        1590, 0,    0,    0,    0,    0,    338,  2155, 0,    160,  0,    0,    3011, 0,    0,    2540,
        0,    0,    0,    0,    0,    0,    259,  357,  2117, 2849, 1571, 892,  0,    0,    0,    2389,
        0,    2925, 0,    0,    0,    1328, 0,    0,    0,    0,    0,    0,    0,    0,    2180, 0,
        0,    0,    0,    1245, 994,  0,    0,    0,    0,    0,    0,    298,  1730, 0,    0,    0,
        0,    0,    0,    0,    1896, 0,    2621, 0,    0,    0,    1775, 0,    31,   686,  0,    0,
        1918, 1604, 0,    0,    223,  0,    2180, 2340, 402,  0,    3016, 0,    0,    1417, 2779, 0,
        1997, 1008, 0,    0,    0,    0,    3044, 0,    0,    1442, 0,    0,    1875, 635,  267,  2289,
        0,    0,    2636, 767,  1057, 0,    0,    757,  529,  0,    0,    0,    1274, 1512, 0,    2518,
        1481, 0,    1696, 225,  0,    1498, 0,    2857, 3013, 0,    0,    0,    387,  0,    0,    531,
        0,    958,  134,  0,    1051, 2365, 0,    526,  0,    0,    1979, 0,    2767, 0,    0,    0,
        0,    1072, 0,    0,    22,   318,  1114, 0,    0,    0,    0,    2157, 986,  561,  0,    0,
        0,    0,    0,    0,    1951, 0,    360,  0,    0,    0,    0,    0,    94,   0,    0,    0,
        1465, 0,    260,  0,    487,  0,    0,    944,  95,   2735, 457,  0,    0,    0,    0,    952,
        0,    0,    1976, 0,    0,    0,    0,    1152, 0,    1439, 0,    0,    0,    0,    0,    0,
        1675, 1241, 0,    2508, 209,  0,    0,    0,    837,  0,    2955, 0,    1621, 684,  2086, 103,
        2657, 0,    0,    0,    0,    0,    0,    0,    0,    0,    751,  0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    2775, 1568, 0,    0,    0,    0,    0,    0,
        0,    0,    0,    1464, 1396, 0,    209,  0,    1155, 265,  979,  0,    0,    0,    0,    0,
        0,    2676, 1641, 2686, 0,    0,    0,    0,    666,  376,  3201, 0,    576,  2836, 0,    551,
        3151, 0,    1329, 974,  206,  0,    1210, 0,    0,    0,    1372, 2145, 2809, 0,    0,    1017,
        0,    816,  0,    0,    0,    1268, 0,    0,    0,    1932, 0,    2907, 0,    234,  0,    762,
        2660, 0,    0,    2615, 0,    0,    3000, 0,    0,    0,    356,  1757, 662,  776,  299,  0,
        0,    0,    185,  0,    0,    0,    2729, 0,    0,    0,    0,    0,    2630, 1516, 2008, 0,
        1097, 0,    2759, 0,    0,    3089, 0,    0,    1183, 0,    0,    0,    0,    0,    0,    1305,
        0,    0,    360,  3014, 0,    0,    720,  0,    594,  2525, 0,    0,    826,  0,    2804, 0,
        49,   0,    2537, 0,    0,    720,  1277, 1408, 0,    2736, 0,    1434, 0,    1323, 349,  0,
        0,    0,    0,    0,    0,    982,  0,    51,   0,    2432, 1688, 0,    0,    1554, 0,    2847,
        0,    0,    1032, 0,    0,    0,    2091, 0,    0,    0,    2702, 0,    0,    0,    195,  1234,
        656,  0,    0,    464,  0,    1014, 83,   0,    997,  0,    1849, 2141, 0,    0,    0,    3129,
        0,    0,    0,    0,    2368, 3080, 2308, 163,  816,  0,    0,    1423, 2009, 0,    2286, 0,
        0,    1717, 507,  1269, 1751, 2575, 0,    0,    570,  0,    0,    0,    1425, 0,    0,    0,
        21,   0,    0,    0,    0,    2758, 0,    0,    2459, 942,  0,    1280, 0,    0,    0,    26,
        0,    0,    0,    0,    0,    0,    0,    111,  0,    1516, 970,  2162, 2781, 1113, 0,    0,
        0,    0,    0,    0,    1805, 0,    0,    0,    2662, 3083, 295,  1860, 0,    0,    0,    0,
        0,    2063, 0,    0,    1906, 2641, 0,    1177, 0,    0,    40,   0,    55,   77,   0,    750,
        0,    0,    0,    0,    695,  864,  797,  0,    62,   0,    2634, 0,    2953, 86,   0,    0,
        0,    254,  0,    0,    0,    349,  0,    0,    0,    1819, 0,    434,  1607, 608,  0,    0,
        1866, 618,  2424, 0,    1386, 0,    1497, 0,    394,  0,    0,    0,    0,    0,    1615, 0,
        27,   1615, 786,  0,    0,    1032, 0,    3112, 0,    0,    1313, 1680, 0,    0,    0,    1050,
        0,    0,    1244, 2277, 400,  0,    1077, 1490, 0,    567,  0,    0,    2415, 0,    848,  0,
        0,    1120, 0,    2448, 0,    0,    358,  0,    0,    0,    902,  44,   1667, 0,    0,    0,
        0,    0,    0,    2822, 0,    0,    1130, 0,    1802, 400,  0,    547,  262,  0,    294,  1229,
        2854, 2089, 0,    1056, 0,    713,  247,  238,  637,  1063, 2397, 0,    0,    0,    2386, 0,
        1122, 152,  238,  0,    0,    1303, 2562, 0,    0,    0,    0,    0,    829,  0,    2710, 1126,
        0,    1357, 2304, 1191, 1086, 0,    2457, 2740, 314,  0,    0,    1253, 3128, 0,    0,    0,
        0,    0,    995,  0,    993,  0,    0,    1761, 0,    0,    2908, 0,    0,    1456, 0,    2489,
        0,    1112, 2795, 1077, 1398, 0,    2517, 0,    0,    0,    0,    636,  0,    1014, 0,    280,
        411,  0,    941,  0,    0,    0,    2404, 476,  1513, 2692, 0,    1205, 2012, 376,  153,  799,
        3168, 0,    736,  0,    0,    0,    0,    1436, 0,    0,    0,    0,    0,    0,    0,    1193,
        211,  1919, 0,    0,    581,  629,  3133, 0,    2604, 0,    0,    0,    1189, 879,  0,    2783,
        2603, 999,  0,    260,  2092, 0,    1495, 870,  0,    0,    927,  0,    0,    0,    1519, 0,
        786,  1876, 2013, 237,  600,  0,    1236, 0,    0,    0,    2342, 0,    1600, 2014, 0,    40,
        115,  0,    0,    2538, 0,    1611, 0,    0,    674,  1385, 20,   2882, 0,    991,  1029, 131,
        869,  1042, 0,    0,    2298, 0,    0,    0,    2321, 0,    2348, 0,    2143, 0,    0,    1342,
        864,  1214, 1371, 0,    1678, 2285, 0,    0,    0,    2588, 0,    0,    0,    0,    0,    0,
        3103, 341,  0,    153,  1092, 1195, 0,    1265, 34,   336,  179,  0,    1549, 1172, 0,    0,
        201,  0,    0,    684,  0,    610,  0,    726,  0,    1808, 0,    677,  0,    412,  1473, 0,
        0,    0,    2008, 0,    0,    0,    897,  2815, 2450, 0,    1353, 1485, 51,   351,  255,  0,
        574,  383,  2741, 0,    752,  0,    0,    3178, 782,  195,  190,  0,    0,    0,    1946, 0,
        189,  0,    0,    0,    47,   0,    0,    3060, 0,    0,    0,    2205, 0,    0,    0,    613,
        0,    3025, 2873, 3061, 1901, 0,    960,  0,    0,    0,    471,  1057, 1553, 218,  1238, 2871,
        0,    0,    0,    0,    0,    0,    0,    0,    2444, 0,    450,  532,  0,    0,    0,    2563,
        0,    0,    2679, 0,    0,    1410, 847,  0,    0,    1007, 0,    138,  724,  0,    1630, 569,
        0,    466,  727,  438,  755,  0,    0,    0,    1378, 1939, 0,    0,    1161, 1435, 0,    868,
        0,    0,    0,    1320, 0,    0,    0,    3036, 3051, 564,  942,  243,  0,    0,    800,  985,
        0,    1231, 0,    0,    723,  400,  1885, 1069, 632,  0,    2578, 2616, 871,  71,   0,    1005,
        0,    0,    0,    688,  2762, 0,    0,    935,  0,    444,  500,  0,    1832, 1792, 0,    0,
        0,    2521, 1378, 0,    952,  0,    1093, 0,    0,    1704, 0,    59,   0,    882,  0,    0,
        1443, 0,    0,    793,  0,    2022, 2801, 0,    0,    0,    0,    750,  0,    1304, 1797, 0,
        2390, 0,    0,    0,    0,    0,    0,    0,    2534, 2679, 0,    615,  0,    609,  1465, 0,
        87,   833,  0,    0,    0,    0,    0,    695,  0,    779,  0,    2680, 0,    0,    3041, 0,
        2419, 2865, 1482, 0,    0,    0,    2542, 0,    824,  1513, 0,    3029, 2493, 0,    0,    1890,
        0,    1178, 2950, 0,    1721, 0,    699,  0,    1961, 394,  2098, 1313, 0,    1834, 971,  0,
        0,    1317, 0,    2821, 0,    2540, 192,  396,  0,    0,    953,  0,    2476, 0,    2549, 0,
        1510, 953,  1810, 0,    0,    0,    1273, 1037, 0,    0,    0,    0,    0,    3051, 1319, 39,
        3091, 0,    2203, 0,    0,    279,  0,    816,  0,    975,  0,    0,    733,  2513, 1729, 710,
        1498, 271,  1131, 2177, 0,    2602, 262,  1367, 0,    264,  0,    2406, 725,  0,    0,    1649,
        0,    0,    0,    3116, 420,  0,    1556, 0,    333,  0,    0,    0,    872,  101,  0,    665,
        1494, 0,    3053, 2246, 0,    0,    1408, 2257, 469,  0,    0,    2499, 0,    1340, 0,    2469,
        903,  0,    0,    0,    0,    0,    911,  0,    0,    161,  2224, 105,  801,  1252, 1128, 0,
        1600, 0,    0,    0,    1777, 0,    2595, 0,    0,    0,    0,    203,  0,    0,    625,  516,
        0,    0,    0,    2569, 962,  965,  529,  1922, 1474, 0,    0,    601,  2722, 0,    2609, 1984,
        1858, 0,    0,    0,    2838, 2453, 0,    0,    690,  1538, 1542, 1234, 1053, 0,    0,    2339,
        0,    217,  3166, 0,    784,  133,  2851, 0,    0,    0,    0,    557,  0,    17,   0,    0,
        0,    507,  0,    0,    0,    1562, 2420, 555,  1985, 761,  0,    377,  0,    0,    2346, 0,
        1114, 1213, 0,    2850, 0,    0,    1421, 352,  0,    1378, 0,    2757, 0,    608,  0,    0,
        0,    0,    14,   1267, 0,    492,  0,    997,  2095, 1840, 0,    701,  777,  1129, 0,    1857,
        0,    614,  0,    0,    0,    0,    449,  0,    0,    2067, 0,    2097, 2602, 588,  1770, 3019,
        658,  0,    0,    0,    0,    0,    0,    958,  289,  0,    0,    2568, 264,  0,    1219, 0,
        0,    1503, 2284, 2956, 1042, 2798, 0,    104,  1478, 0,    998,  419,  0,    0,    2348, 2722,
        1382, 0,    0,    0,    642,  0,    0,    341,  1009, 0,    0,    0,    0,    2739, 0,    1398,
        0,    0,    2093, 2650, 522,  694,  0,    0,    1056, 0,    0,    1601, 0,    742,  0,    108,
        2260, 0,    1631, 754,  0,    96,   0,    0,    2594, 0,    0,    736,  135,  0,    0,    613,
        0,    1115, 0,    939,  0,    0,    222,  0,    2208, 2127, 0,    1815, 0,    0,    31,   1343,
        0,    2203, 1560, 0,    0,    0,    1283, 0,    2686, 2391, 1111, 0,    1379, 0,    334,  511,
        0,    1113, 0,    0,    3176, 3182, 0,    373,  2633, 732,  0,    0,    1510, 0,    0,    1805,
        919,  0,    0,    2560, 527,  1470, 2245, 0,    782,  1024, 0,    561,  1649, 2194, 0,    0,
        973,  1097, 0,    0,    496,  210,  0,    0,    0,    0,    0,    819,  42,   0,    0,    1088,
        13,   1290, 0,    0,    0,    0,    0,    0,    0,    0,    2581, 506,  2694, 125,  0,    861,
        0,    348,  0,    1182, 191,  0,    0,    0,    2539, 763,  0,    0,    0,    2634, 2589, 1380,
        54,   0,    259,  1559, 0,    0,    0,    0,    48,   2340, 0,    934,  1991, 0,    2477, 1248,
        2741, 1325, 0,    2883, 0,    802,  0,    0,    1140, 98,   995,  26,   2534, 1846, 0,    0,
        0,    0,    0,    2557, 738,  0,    0,    2874, 1018, 28,   506,  286,  0,    930,  0,    20,
        0,    0,    0,    0,    1320, 2862, 227,  374,  1231, 0,    1863, 0,    1590, 1858, 0,    0,
        41,   0,    3045, 2529, 0,    1059, 0,    2842, 1539, 0,    1324, 2355, 959,  0,    543,  925,
        2748, 461,  525,  0,    2302, 0,    795,  2347, 196,  0,    0,    787,  1650, 1166, 0,    272,
        877,  3091, 0,    0,    0,    0,    0,    202,  1381, 1116, 0,    3131, 1436, 787,  0,    0,
        0,    0,    4,    11,   1454, 1602, 0,    0,    0,    1395, 0,    0,    3026, 0,    1461, 0,
        1387, 1830, 1207, 134,  0,    472,  1681, 1515, 0,    83,   886,  2447, 0,    0,    3189, 106,
        330,  0,    2416, 256,  0,    1477, 844,  0,    2799, 2,    410,  1422, 1257, 651,  0,    0,
        0,    604,  0,    3038, 1339, 437,  766,  0,    1292, 203,  367,  677,  830,  762,  1947, 1195,
        0,    333,  0,    716,  3027, 284,  0,    0,    0,    0,    0,    0,    0,    725,  698,  1302,
        0,    0,    439,  0,    0,    240,  0,    895,  1599, 660,  1837, 2331, 573,  0,    0,    0,
        1103, 863,  0,    3194, 680,  772,  0,    0,    1170, 0,    0,    0,    0,    984,  1400, 0,
        1860, 0,    1948, 26,   345,  1132, 264,  1098, 89,   0,    0,    0,    0,    20,   0,    2,
        968,  3078, 612,  0,    0,    0,    623,  0,    0,    0,    0,    1105, 0,    0,    2285, 1669,
        0,    0,    0,    998,  231,  1221, 344,  0,    605,  0,    1082, 1553, 1111, 0,    0,    1153,
        0,    0,    0,    1779, 0,    1282, 0,    0,    1911, 103,  1059, 256,  0,    0,    3000, 566,
        0,    1228, 0,    0,    519,  0,    0,    0,    0,    450,  1096, 0,    3042, 1738, 0,    0,
        0,    0,    2807, 0,    0,    0,    1069, 0,    2206, 112,  1341, 2077, 0,    2769, 1110, 828,
        157,  865,  1451, 589,  0,    2538, 0,    1159, 0,    453,  51,   0,    0,    1828, 777,  295,
        1196, 719,  2161, 1376, 0,    551,  0,    224,  0,    0,    0,    0,    0,    141,  0,    0,
        2924, 0,    1509, 442,  1403, 750,  1388, 0,    0,    0,    0,    0,    0,    0,    3008, 523,
        1074, 1323, 1194, 2430, 0,    688,  43,   0,    424,  0,    617,  0,    0,    0,    2874, 0,
        2426, 0,    2711, 0,    611,  839,  891,  1977, 0,    1167, 0,    2304, 0,    55,   0,    0,
        2714, 0,    298,  322,  0,    0,    2719, 2741, 614,  902,  1092, 310,  0,    0,    1294, 897,
        0,    0,    0,    567,  814,  1472, 1532, 0,    1080, 366,  0,    1927, 660,  1091, 0,    2338,
        2182, 2593, 0,    2099, 0,    1597, 136,  2870, 0,    790,  1757, 410,  0,    0,    1592, 781,
        0,    0,    6,    571,  2030, 1614, 356,  834,  0,    1716, 0,    1493, 1291, 1397, 644,  0,
        537,  2957, 984,  0,    0,    0,    852,  0,    0,    1944, 1090, 531,  0,    270,  271,  2004,
        1154, 1372, 928,  3,    0,    0,    0,    1456, 2178, 0,    1888, 0,    0,    0,    0,    117,
        0,    0,    2057, 708,  0,    0,    1963, 0,    0,    0,    79,   0,    1365, 0,    0,    2489,
        0,    398,  0,    214,  1502, 175,  0,    3043, 0,    571,  1002, 0,    0,    2853, 0,    408,
        651,  778,  0,    0,    0,    3185, 0,    2087, 0,    0,    0,    0,    209,  2708, 1063, 0,
        0,    0,    3138, 1138, 1347, 0,    0,    0,    406,  1264, 1372, 294,  2727, 1035, 2836, 450,
        607,  0,    388,  1118, 0,    1312, 475,  1367, 858,  0,    0,    0,    0,    2281, 0,    0,
        193,  0,    0,    2747, 0,    699,  0,    509,  159,  1415, 0,    0,    1571, 1338, 378,  1356,
        0,    1021, 0,    362,  54,   815,  1631, 0,    0,    48,   0,    0,    0,    160,  0,    2925,
        1613, 1022, 896,  361,  0,    406,  711,  1911, 0,    248,  750,  0,    0,    964,  1474, 2435,
        1134, 0,    1236, 0,    1575, 2473, 1559, 987,  1076, 1972, 290,  0,    0,    1357, 2326, 1611,
        1435, 0,    1905, 262,  0,    0,    45,   521,  1979, 92,   0,    0,    0,    64,   2909, 1048,
        2287, 0,    1389, 313,  76,   266,  3183, 2636, 2000, 3125, 0,    1696, 110,  621,  2243, 0,
        0,    0,    2821, 1431, 0,    1153, 0,    3111, 0,    0,    107,  1269, 0,    0,    2139, 0,
        645,  0,    0,    0,    2390, 1574, 943,  0,    0,    1628, 2452, 104,  0,    776,  0,    0,
        0,    1411, 3190, 1816, 1187, 636,  918,  1833, 0,    652,  0,    970,  0,    1099, 921,  0,
        1718, 1476, 2007, 297,  1560, 1437, 539,  0,    2347, 1838, 1041, 0,    305,  1189, 0,    2997,
        0,    1153, 253,  130,  1075, 2217, 2642, 2803, 0,    50,   2498, 730,  1856, 2031, 0,    0,
        0,    0,    0,    1583, 2818, 819,  0,    71,   3132, 0,    0,    60,   0,    63,   947,  1512,
        880,  914,  0,    986,  2095, 1527, 63,   0,    2596, 432,  514,  1518, 0,    1620, 0,    767,
        0,    2679, 629,  1479, 0,    85,   2993, 0,    0,    67,   0,    3023, 1294, 0,    1607, 971,
        0,    123,  1981, 0,    100,  0,    1541, 0,    413,  473,  433,  588,  57,   752,  0,    2198,
        1350, 2019, 1597, 1001, 582,  950,  1553, 2968, 0,    1582, 909,  1286, 0,    0,    2325, 207,
        742,  303,  1162, 1051, 0,    1690, 2785, 289,  0,    0,    1836, 402,  0,    0,    0,    0,
        0,    0,    1049, 479,  261,  0,    1388, 0,    1996, 458,  1867, 89,   2969, 748,  2811, 0,
        555,  957,  0,    0,    145,  775,  582,  0,    0,    0,    1883, 452,  3083, 936,  2420, 183,
        0,    740,  0,    0,    0,    1644, 2926, 0,    0,    0,    0,    1380, 0,    15,   1240, 7,
        0,    0,    1426, 1479, 0,    0,    288,  1060, 587,  1257, 95,   419,  3193, 2733, 1226, 0,
        0,    0,    0,    867,  0,    3036, 0,    583,  124,  1617, 0,    1350, 1542, 0,    0,    347,
        0,    0,    0,    0,    2847, 739,  727,  0,    0,    66,   0,    0,    2812, 0,    984,  0,
        459,  0,    0,    2300, 0,    0,    1417, 0,    2381, 2612, 0,    865,  263,  0,    0,    88,
        1725, 0,    2246, 250,  19,   1274, 0,    1676, 1118, 2849, 1006, 1374, 317,  1541, 1280, 0,
        0,    2970, 0,    853,  961,  894,  91,   2650, 0,    65,   2741, 2997, 441,  89,   0,    0,
        496,  1463, 1074, 1143, 1539, 0,    0,    0,    0,    1067, 3164, 1241, 0,    544,  0,    0,
        151,  2940, 0,    845,  0,    0,    690,  0,    0,    536,  11,   914,  0,    0,    1120, 2774,
        1377, 1819, 0,    2689, 0,    539,  0,    1459, 0,    992,  2639, 1535, 0,    221,  1993, 0,
        828,  0,    0,    0,    67,   2449, 1420, 0,    0,    312,  313,  0,    1020, 0,    0,    1721,
        58,   37,   138,  717,  2157, 0,    1263, 463,  0,    2590, 0,    1567, 2526, 502,  1965, 0,
        2443, 0,    2029, 1334, 2964, 2219, 130,  3146, 635,  389,  2610, 0,    0,    0,    0,    234,
        0,    0,    1331, 0,    2463, 0,    1915, 498,  1157, 377,  2030, 0,    1569, 462,  0,    0,
        1175, 484,  1165, 0,    238,  0,    797,  289,  2371, 0,    1000, 1588, 2071, 2501, 2023, 873,
        0,    338,  0,    57,   1785, 6,    0,    0,    654,  0,    0,    173,  0,    0,    778,  0,
        0,    1650, 1253, 0,    1235, 0,    0,    1310, 0,    340,  117,  0,    0,    0,    1750, 51,
        0,    1419, 0,    189,  257,  0,    0,    1838, 0,    1083, 2242, 0,    0,    1396, 0,    134,
        2455, 1226, 0,    755,  1381, 0,    3002, 0,    2635, 1046, 1612, 1192, 1268, 476,  1061, 608,
        2224, 648,  3066, 5,    1053, 2338, 173,  1109, 0,    412,  0,    210,  590,  3089, 0,    2449,
        1126, 339,  173,  0,    528,  1059, 0,    1712, 1126, 749,  0,    1580, 0,    0,    728,  2092,
        1085, 2590, 0,    944,  2513, 2011, 0,    0,    400,  90,   0,    0,    204,  3025, 1289, 0,
        929,  1589, 3184, 2167, 2523, 0,    509,  877,  0,    1524, 0,    0,    734,  1273, 1202, 1272,
        577,  0,    955,  0,    0,    2829, 0,    251,  1046, 1821, 1526, 610,  482,  633,  0,    761,
        1135, 0,    1011, 2592, 305,  0,    2263, 2789, 1497, 2284, 1471, 0,    0,    499,  715,  810,
        591,  0,    155,  0,    169,  0,    0,    574,  741,  1,    0,    2112, 164,  2066, 0,    0,
        2014, 785,  2528, 0,    0,    0,    563,  371,  0,    667,  1245, 0,    579,  993,  2397, 2322,
        0,    0,    2987, 12,   408,  0,    878,  2369, 639,  3107, 0,    1370, 3147, 334,  0,    0,
        1426, 2062, 0,    1567, 275,  0,    1897, 2170, 0,    0,    1453, 916,  0,    0,    0,    124,
        2760, 881};
    
    int MangledHashG(const char *key, const int *T)
    {
        int sum = 0;
    
        for (int i = 0; key[i] != '\0'; i++)
        {
            sum += T[i] * key[i];
            sum %= 3202;
        }
        return mangledkG[sum];
    }
    
    int MangledPerfectHash(const char *key)
    {
        if (strlen(key) > 40)
            return 0;
    
        return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 3202;
    }
    
    constexpr int unmangledkT1[] = {6,   290, 162, 21, 80,  121, 230, 49,  59,  182, 261, 224, 128,
                                    200, 242, 168, 95, 222, 276, 152, 237, 309, 170, 123, 247, 239};
    constexpr int unmangledkT2[] = {219, 287, 171, 169, 56,  255, 117, 203, 164, 103, 91,  81,  292,
                                    312, 84,  310, 298, 114, 186, 164, 192, 256, 44,  134, 238, 233};
    constexpr int unmangledkG[]  = {
        0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   190, 0,   0,
        140, 0,   0,   0,   0,   161, 74,  0,   61,  291, 0,   0,   258, 175, 0,   0,   0,   198, 0,
        84,  274, 0,   147, 193, 79,  156, 0,   0,   43,  6,   191, 0,   0,   0,   0,   73,  0,   0,
        0,   84,  98,  27,  0,   0,   241, 0,   126, 136, 313, 0,   0,   30,  209, 16,  0,   60,  0,
        0,   0,   0,   46,  0,   44,  0,   106, 0,   0,   0,   0,   197, 0,   82,  75,  0,   0,   0,
        0,   0,   4,   87,  0,   179, 238, 0,   0,   245, 128, 0,   167, 0,   125, 115, 118, 0,   134,
        22,  137, 0,   0,   67,  0,   0,   238, 261, 0,   240, 0,   232, 0,   141, 0,   187, 0,   94,
        0,   294, 186, 0,   269, 86,  0,   147, 0,   0,   0,   0,   0,   0,   65,  154, 210, 0,   290,
        0,   73,  158, 0,   0,   0,   294, 284, 0,   0,   0,   0,   101, 0,   108, 0,   0,   0,   0,
        0,   0,   0,   0,   100, 0,   299, 70,  283, 7,   55,  233, 155, 94,  232, 293, 0,   124, 207,
        0,   0,   0,   302, 0,   60,  152, 199, 0,   41,  0,   173, 238, 17,  145, 156, 0,   0,   0,
        82,  107, 6,   66,  162, 0,   318, 164, 48,  94,  0,   0,   263, 165, 0,   316, 68,  128, 0,
        78,  264, 257, 99,  153, 1,   45,  182, 0,   0,   0,   0,   0,   0,   0,   90,  69,  317, 0,
        23,  0,   0,   143, 0,   63,  2,   34,  14,  0,   0,   49,  53,  0,   201, 92,  146, 1,   282,
        132, 0,   161, 99,  63,  272, 0,   0,   0,   3,   159, 250, 0,   0,   0,   131, 288, 0,   209,
        0,   127, 99,  0,   163, 101, 185, 0,   0,   0,   74,  0,   0,   0,   0,   139, 290, 23,  0,
        19,  91,  155, 0,   0,   205, 0,   65,  46,  0,   0,   35,  128, 242, 85,  316, 11};
    
    int UnmangledHashG(const char *key, const int *T)
    {
        int sum = 0;
    
        for (int i = 0; key[i] != '\0'; i++)
        {
            sum += T[i] * key[i];
            sum %= 321;
        }
        return unmangledkG[sum];
    }
    
    int UnmangledPerfectHash(const char *key)
    {
        if (strlen(key) > 26)
            return 0;
    
        return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 321;
    }
    
    }  // namespace
    
    namespace sh
    {
    
    template <>
    const size_t ImmutableString::FowlerNollVoHash<4>::kFnvPrime = 16777619u;
    
    template <>
    const size_t ImmutableString::FowlerNollVoHash<4>::kFnvOffsetBasis = 0x811c9dc5u;
    
    template <>
    const size_t ImmutableString::FowlerNollVoHash<8>::kFnvPrime =
        static_cast<size_t>(1099511628211ull);
    
    template <>
    const size_t ImmutableString::FowlerNollVoHash<8>::kFnvOffsetBasis =
        static_cast<size_t>(0xcbf29ce484222325ull);
    
    uint32_t ImmutableString::mangledNameHash() const
    {
        return MangledPerfectHash(data());
    }
    
    uint32_t ImmutableString::unmangledNameHash() const
    {
        return UnmangledPerfectHash(data());
    }
    
    }  // namespace sh