Edit

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

Branch :

  • Show log

    Commit

  • Author : Clemen Deng
    Date : 2019-08-01 17:09:53
    Hash : 56db3789
    Message : Use flat arrays instead of switches for function lookups Current implementation of built in function lookup uses autogenerated switch statements. Instead, use the perfect hash mapping to have the lookup use arrays instead. This will improve runtime performance. Bug: angleproject:3805 Change-Id: I6d0ba62d79abd53a7fe818fe675282800781f256 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1756883 Commit-Queue: Clemen Deng <clemendeng@google.com> Reviewed-by: Geoff Lang <geofflang@chromium.org>

  • src/compiler/translator/ImmutableString_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 2019 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_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[] = {2719, 2955, 3884, 1726, 3262, 1871, 1439, 3101, 2584, 1304,
                                  2473, 443,  3851, 132,  300,  2929, 3304, 3930, 1779, 3960,
                                  2114, 1454, 2489, 1923, 1745, 972,  1092, 2973, 152,  822,
                                  1230, 1001, 1930, 4008, 2050, 1350, 758};
    constexpr int mangledkT2[] = {383,  1244, 2085, 3708, 251,  2282, 2314, 3643, 1561, 1995,
                                  2797, 953,  2676, 1891, 1011, 1052, 2494, 2853, 1193, 1625,
                                  4065, 1572, 3492, 1910, 4194, 4013, 546,  2118, 14,   929,
                                  2264, 3644, 1570, 1400, 1304, 3634, 2163};
    constexpr int mangledkG[]  = {
        0,    0,    0,    0,    0,    0,    0,    0,    3926, 0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    2146, 0,
        0,    0,    0,    0,    0,    2678, 0,    0,    0,    0,    0,    15,   0,    1063, 0,    0,
        0,    0,    0,    2530, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3799, 0,
        0,    0,    0,    0,    0,    3221, 3061, 1661, 0,    0,    0,    0,    0,    0,    0,    2529,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3657, 0,    188,  0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    338,  0,    1270, 0,    0,    2040, 0,    0,
        1910, 0,    4154, 0,    0,    0,    0,    1859, 0,    0,    1758, 0,    0,    0,    3306, 0,
        0,    2755, 0,    0,    0,    0,    0,    0,    504,  0,    0,    0,    0,    0,    0,    3818,
        244,  0,    1353, 0,    0,    0,    400,  0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    2786, 0,    2047, 0,    556,  0,    0,    0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    1431, 0,    0,    3740, 0,    0,    78,   0,    2694,
        0,    923,  0,    0,    0,    0,    0,    960,  1327, 0,    0,    0,    0,    0,    0,    0,
        0,    633,  2581, 0,    2612, 0,    0,    366,  3236, 0,    0,    0,    0,    1640, 0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    3910, 694,  3979, 0,    0,    268,
        3802, 0,    0,    2900, 0,    2145, 0,    0,    1062, 0,    0,    518,  0,    0,    0,    0,
        0,    0,    3990, 0,    0,    0,    1188, 0,    0,    0,    0,    0,    0,    0,    0,    0,
        3789, 0,    0,    1447, 0,    1955, 1174, 0,    0,    0,    2940, 2811, 593,  0,    0,    2477,
        0,    677,  0,    0,    1756, 0,    0,    429,  0,    0,    0,    0,    1560, 0,    0,    0,
        1289, 0,    0,    0,    0,    2167, 2850, 0,    0,    0,    877,  0,    1978, 0,    0,    0,
        0,    0,    0,    0,    0,    0,    1750, 0,    0,    0,    847,  0,    0,    0,    634,  0,
        0,    0,    0,    0,    0,    0,    148,  0,    2442, 3012, 0,    3889, 3525, 0,    0,    0,
        0,    2078, 0,    0,    3687, 0,    0,    0,    350,  0,    0,    0,    0,    0,    0,    0,
        253,  0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    114,  1738, 0,
        0,    0,    0,    2796, 169,  0,    11,   2179, 0,    3234, 0,    0,    0,    0,    0,    368,
        742,  0,    0,    911,  0,    0,    986,  0,    0,    1758, 0,    0,    899,  2142, 0,    0,
        0,    0,    0,    387,  0,    1528, 0,    0,    141,  0,    0,    2132, 0,    3603, 0,    0,
        0,    0,    0,    0,    0,    0,    66,   0,    0,    0,    1440, 668,  0,    351,  0,    619,
        0,    0,    2439, 3012, 0,    3914, 0,    0,    0,    0,    0,    4063, 0,    1732, 0,    0,
        0,    0,    0,    1045, 0,    0,    0,    2136, 0,    0,    4154, 0,    0,    0,    0,    0,
        0,    4101, 0,    1479, 0,    831,  3082, 834,  0,    0,    0,    1963, 0,    33,   316,  2098,
        2847, 1715, 0,    0,    0,    1197, 0,    0,    0,    0,    0,    0,    0,    0,    0,    305,
        0,    3994, 0,    307,  0,    0,    0,    0,    2827, 998,  0,    0,    0,    0,    3390, 536,
        961,  1033, 0,    0,    0,    0,    0,    749,  227,  1715, 4104, 1944, 0,    0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    3763, 0,    0,    0,    2450, 3015, 0,    0,    0,
        1442, 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    617,  0,    0,    0,    0,
        1744, 0,    1931, 0,    0,    0,    0,    0,    0,    0,    146,  0,    2120, 0,    0,    555,
        0,    0,    0,    534,  2107, 2292, 829,  0,    0,    0,    241,  419,  3799, 0,    35,   0,
        0,    0,    0,    0,    2013, 0,    1065, 0,    0,    0,    0,    0,    0,    0,    0,    1703,
        0,    0,    785,  0,    3489, 0,    0,    0,    1551, 0,    0,    0,    0,    0,    0,    0,
        502,  0,    3011, 0,    3005, 2780, 0,    405,  0,    0,    3022, 744,  0,    2807, 0,    2861,
        4184, 3067, 1952, 0,    0,    0,    0,    3558, 2525, 2628, 0,    1052, 0,    2785, 0,    0,
        3516, 0,    0,    0,    0,    0,    522,  2369, 2169, 0,    3285, 0,    0,    0,    3711, 0,
        973,  1768, 1750, 0,    3573, 1934, 0,    927,  0,    750,  1952, 0,    548,  0,    781,  1343,
        0,    1862, 0,    0,    0,    0,    0,    898,  0,    1184, 0,    0,    0,    0,    1580, 2245,
        0,    3966, 0,    2764, 0,    2642, 0,    0,    3176, 0,    0,    0,    1937, 0,    0,    1497,
        4051, 3352, 0,    0,    1698, 859,  961,  1237, 2570, 3024, 0,    0,    0,    2091, 0,    635,
        3109, 3297, 0,    1259, 0,    1132, 0,    733,  3472, 0,    2044, 0,    2667, 0,    0,    315,
        0,    0,    526,  0,    586,  194,  0,    0,    0,    0,    0,    2067, 4078, 3243, 0,    3157,
        0,    0,    0,    3852, 252,  0,    412,  0,    0,    0,    0,    1060, 0,    0,    1068, 2310,
        0,    0,    0,    3588, 0,    0,    715,  0,    1361, 0,    0,    0,    1983, 0,    638,  0,
        0,    1936, 2162, 671,  0,    427,  216,  4108, 0,    3513, 1635, 632,  1518, 611,  4195, 1168,
        0,    0,    0,    2317, 0,    0,    3903, 3840, 0,    0,    0,    0,    4068, 0,    0,    0,
        0,    0,    1118, 2737, 0,    0,    0,    2641, 512,  0,    0,    0,    0,    0,    0,    0,
        0,    2537, 0,    1000, 519,  2026, 0,    3920, 0,    4037, 0,    3275, 0,    0,    0,    919,
        0,    1016, 0,    0,    586,  4137, 0,    1283, 0,    0,    0,    2547, 0,    0,    3614, 0,
        0,    0,    0,    0,    0,    0,    2661, 0,    0,    0,    681,  0,    0,    0,    34,   0,
        3298, 0,    0,    0,    0,    4114, 523,  951,  405,  2961, 0,    0,    614,  443,  0,    780,
        0,    0,    426,  1827, 0,    0,    0,    1334, 0,    0,    0,    0,    0,    182,  3585, 0,
        0,    0,    3137, 297,  0,    0,    0,    1558, 3435, 0,    0,    0,    0,    0,    1607, 0,
        3748, 320,  2186, 3194, 0,    734,  1474, 163,  1705, 0,    0,    1954, 0,    0,    2882, 3153,
        1352, 0,    0,    435,  0,    0,    0,    0,    2332, 0,    0,    0,    0,    762,  131,  0,
        0,    0,    0,    223,  0,    0,    4047, 0,    1088, 0,    0,    0,    0,    0,    0,    0,
        0,    3220, 0,    1535, 0,    0,    0,    2917, 0,    290,  1873, 0,    0,    0,    388,  3031,
        1272, 978,  0,    0,    0,    0,    0,    0,    0,    574,  2662, 0,    165,  0,    2100, 0,
        1943, 0,    3604, 1663, 745,  3807, 224,  401,  0,    0,    0,    0,    0,    0,    3406, 1127,
        0,    0,    0,    1149, 2423, 0,    495,  0,    688,  0,    3544, 0,    0,    0,    1627, 0,
        0,    0,    0,    0,    2057, 0,    3379, 19,   2744, 0,    0,    0,    0,    0,    1316, 409,
        1243, 0,    0,    0,    1050, 1302, 548,  0,    0,    0,    0,    2046, 0,    0,    0,    0,
        1579, 0,    0,    0,    787,  1722, 1415, 0,    0,    0,    1528, 919,  0,    0,    516,  0,
        3063, 2254, 0,    0,    1573, 0,    376,  0,    0,    0,    0,    0,    27,   0,    0,    0,
        0,    0,    0,    0,    0,    0,    0,    0,    4111, 1475, 0,    0,    0,    0,    0,    518,
        0,    1435, 0,    3053, 0,    765,  0,    1088, 2966, 525,  0,    0,    0,    0,    0,    1301,
        3265, 0,    0,    919,  0,    0,    0,    0,    0,    0,    0,    2215, 3413, 0,    0,    0,
        0,    1326, 1071, 0,    0,    1429, 0,    0,    4015, 2036, 1105, 0,    0,    0,    478,  1296,
        0,    1669, 162,  3002, 3028, 0,    0,    1518, 2042, 705,  0,    0,    2602, 0,    0,    0,
        0,    0,    2062, 2834, 0,    0,    581,  3053, 0,    0,    3624, 0,    0,    3854, 0,    0,
        0,    0,    0,    1132, 0,    4104, 0,    0,    1272, 0,    0,    197,  0,    1224, 0,    0,
        723,  0,    0,    0,    0,    0,    617,  0,    0,    3745, 0,    1219, 3585, 0,    0,    0,
        0,    0,    3781, 0,    0,    0,    0,    3223, 45,   0,    0,    0,    0,    876,  0,    334,
        732,  1608, 0,    0,    0,    553,  2825, 2838, 1965, 0,    0,    0,    251,  469,  3114, 1427,
        3612, 0,    0,    432,  0,    558,  926,  0,    58,   2450, 0,    2196, 0,    3898, 3456, 0,
        1459, 2827, 0,    4188, 0,    0,    1206, 0,    0,    2311, 27,   0,    0,    0,    0,    2637,
        823,  4143, 249,  0,    1413, 0,    38,   2359, 0,    0,    0,    747,  1177, 1563, 0,    0,
        3804, 758,  0,    0,    3389, 0,    979,  0,    0,    3761, 866,  5,    0,    1812, 0,    1079,
        0,    0,    0,    2714, 0,    44,   0,    0,    0,    0,    1568, 3865, 3655, 0,    2143, 476,
        1138, 1285, 3533, 3928, 3874, 3491, 3941, 0,    1018, 0,    382,  0,    3893, 1198, 1627, 0,
        0,    0,    0,    695,  2610, 1474, 876,  0,    0,    2004, 0,    0,    1739, 3777, 1274, 1526,
        0,    2375, 0,    0,    0,    0,    0,    3835, 0,    745,  3854, 3723, 602,  0,    439,  0,
        1853, 0,    0,    0,    2104, 4081, 1038, 4109, 0,    3838, 776,  0,    4064, 1222, 0,    0,
        0,    2158, 416,  358,  1123, 0,    3376, 2878, 857,  0,    0,    0,    0,    3025, 3314, 0,
        0,    0,    2040, 0,    0,    0,    0,    505,  3939, 0,    0,    0,    1445, 7,    328,  0,
        0,    0,    0,    242,  0,    3779, 0,    0,    3117, 1432, 0,    0,    0,    1274, 4079, 1656,
        0,    0,    0,    0,    0,    1104, 1772, 1358, 0,    0,    0,    0,    4168, 3799, 3833, 105,
        0,    2404, 444,  0,    885,  3650, 4010, 0,    0,    0,    0,    0,    0,    0,    0,    0,
        0,    3313, 0,    0,    906,  3358, 390,  110,  0,    0,    0,    915,  1803, 2653, 3402, 0,
        2506, 0,    2510, 855,  474,  0,    1452, 1407, 628,  1782, 0,    0,    2019, 0,    0,    1105,
        3584, 0,    3382, 0,    0,    1851, 814,  829,  1314, 0,    28,   570,  0,    0,    744,  162,
        0,    0,    3777, 2924, 0,    0,    1754, 3382, 4195, 0,    3455, 824,  0,    0,    2007, 816,
        1685, 1659, 913,  627,  6,    0,    0,    0,    0,    0,    0,    3311, 0,    2226, 0,    1774,
        1147, 0,    459,  1272, 0,    0,    3962, 0,    1434, 303,  0,    1549, 0,    74,   0,    0,
        0,    1438, 179,  0,    4087, 997,  0,    0,    3727, 2113, 1043, 0,    1008, 0,    0,    0,
        605,  2444, 2987, 0,    1442, 0,    3972, 0,    226,  622,  890,  482,  1073, 1732, 0,    0,
        1196, 2616, 3697, 0,    0,    0,    0,    3306, 0,    1801, 0,    0,    0,    0,    924,  2621,
        2080, 0,    0,    0,    0,    1746, 594,  3712, 0,    0,    0,    0,    3668, 1035, 4043, 1569,
        451,  1747, 1196, 0,    3921, 2483, 0,    2903, 1849, 643,  0,    4044, 0,    1673, 0,    0,
        0,    2021, 0,    1762, 1908, 3862, 929,  1651, 0,    0,    420,  0,    0,    1714, 0,    1330,
        1334, 0,    1346, 1002, 0,    952,  1631, 1549, 3407, 773,  1015, 0,    1664, 825,  941,  0,
        0,    20,   0,    3592, 225,  750,  0,    154,  2959, 0,    2211, 3384, 0,    0,    3041, 1241,
        1790, 198,  0,    1516, 1750, 3752, 0,    282,  172,  0,    0,    0,    3333, 1015, 0,    388,
        1798, 0,    0,    259,  0,    0,    0,    1991, 321,  0,    1334, 763,  347,  0,    479,  0,
        1836, 0,    0,    1337, 1130, 0,    3703, 1825, 0,    3687, 0,    1710, 0,    543,  0,    3443,
        0,    4052, 0,    0,    154,  78,   0,    0,    2518, 3070, 1731, 0,    0,    2256, 1372, 2683,
        100,  1797, 2604, 1508, 0,    0,    0,    2043, 0,    0,    3679, 2695, 0,    0,    0,    1648,
        2445, 3159, 356,  0,    1942, 0,    0,    3781, 480,  0,    0,    986,  3449, 1528, 1358, 3104,
        1247, 0,    0,    0,    0,    0,    1390, 638,  0,    1021, 1910, 0,    2553, 0,    442,  2002,
        0,    600,  0,    0,    0,    0,    1784, 715,  0,    1622, 0,    619,  0,    0,    0,    0,
        3801, 1909, 3053, 1929, 0,    0,    0,    1181, 0,    3039, 174,  4101, 0,    4187, 0,    0,
        0,    201,  928,  1451, 3063, 0,    2909, 736,  0,    0,    0,    0,    193,  673,  0,    3843,
        1042, 0,    2823, 0,    3185, 2065, 4013, 3793, 242,  183,  3343, 1603, 2083, 1143, 1284, 0,
        320,  7,    805,  0,    0,    1923, 1403, 0,    865,  0,    1087, 539,  0,    3242, 0,    0,
        3031, 0,    0,    1317, 2788, 2268, 3913, 0,    447,  0,    0,    3307, 0,    0,    0,    0,
        1970, 1103, 0,    1950, 0,    0,    0,    404,  0,    0,    0,    0,    0,    368,  0,    771,
        4074, 1521, 1930, 0,    1,    1509, 0,    0,    0,    397,  588,  1660, 1151, 2283, 0,    0,
        1328, 1911, 0,    0,    2914, 417,  689,  3907, 1629, 0,    464,  2921, 0,    0,    1200, 0,
        0,    3467, 750,  1383, 2616, 0,    419,  0,    1312, 0,    0,    3524, 3983, 0,    0,    0,
        0,    2055, 3857, 3587, 0,    0,    2066, 721,  4124, 0,    4095, 1230, 0,    0,    2603, 0,
        518,  50,   1788, 1304, 0,    205,  3732, 0,    0,    1913, 0,    0,    1747, 3574, 258,  0,
        0,    1848, 2906, 3944, 986,  2330, 0,    1715, 0,    0,    2668, 3448, 1192, 0,    0,    3960,
        104,  1592, 1340, 0,    0,    575,  2508, 0,    0,    1035, 0,    2222, 2563, 0,    0,    937,
        0,    1787, 2081, 0,    450,  2009, 125,  1555, 0,    0,    0,    0,    0,    2529, 955,  3982,
        274,  0,    1748, 482,  1113, 11,   3428, 885,  0,    3706, 844,  1287, 0,    0,    96,   3318,
        0,    1882, 0,    0,    3255, 3328, 1893, 0,    0,    170,  2122, 907,  1307, 1042, 1776, 2044,
        0,    0,    0,    0,    1880, 1420, 3132, 2939, 1222, 0,    0,    321,  0,    318,  84,   3420,
        0,    0,    1232, 1366, 4134, 0,    877,  0,    0,    99,   674,  1784, 0,    0,    0,    0,
        692,  0,    0,    0,    1907, 2239, 365,  170,  0,    0,    0,    0,    2134, 2251, 2117, 1532,
        0,    3192, 0,    0,    0,    898,  2221, 3837, 0,    1850, 0,    1420, 3573, 939,  0,    2406,
        0,    735,  3200, 1262, 2733, 0,    1629, 1465, 0,    1126, 0,    0,    4042, 3701, 1614, 3195,
        0,    1845, 1416, 0,    1902, 0,    0,    1759, 2813, 101,  261,  2218, 3195, 1354, 0,    868,
        0,    0,    2234, 2076, 75,   0,    869,  0,    0,    3068, 0,    2099, 0,    0,    1747, 0,
        0,    0,    0,    472,  0,    0,    2967, 0,    954,  524,  2202, 0,    0,    639,  0,    0,
        3790, 3763, 0,    3045, 0,    0,    0,    1964, 746,  487,  422,  0,    1466, 0,    4171, 1473,
        88,   1501, 21,   1093, 0,    0,    3594, 1226, 999,  46,   2620, 0,    4196, 0,    0,    0,
        3491, 1487, 626,  3800, 0,    1017, 3361, 1074, 0,    2749, 0,    0,    3239, 1122, 952,  122,
        0,    793,  3861, 1472, 0,    0,    112,  746,  0,    0,    0,    0,    0,    0,    0,    0,
        0,    394,  301,  0,    3940, 926,  0,    325,  1708, 1552, 2796, 1202, 3744, 237,  1880, 0,
        0,    1976, 0,    2184, 188,  217,  2117, 3513, 2334, 802,  3437, 0,    566,  3375, 672,  0,
        1107, 3042, 1090, 0,    0,    0,    0,    0,    615,  0,    1504, 0,    1539, 0,    0,    3988,
        1948, 3805, 0,    242,  3649, 1681, 0,    0,    877,  1782, 1453, 1514, 0,    3056, 1964, 0,
        0,    0,    1137, 0,    0,    641,  1094, 2141, 0,    4004, 1042, 437,  0,    2200, 1239, 3848,
        337,  1011, 0,    1301, 22,   0,    0,    0,    3518, 3747, 0,    1675, 3868, 1620, 0,    3313,
        3375, 0,    0,    169,  2648, 0,    0,    0,    534,  0,    2393, 0,    1708, 0,    0,    1543,
        4017, 849,  4082, 3179, 2992, 0,    0,    790,  0,    0,    0,    240,  0,    1590, 3946, 0,
        0,    901,  0,    0,    1072, 0,    0,    4082, 0,    580,  2673, 1521, 3817, 0,    0,    0,
        2124, 0,    4099, 0,    2127, 1834, 1354, 4081, 0,    0,    718,  1699, 0,    3752, 0,    3418,
        0,    0,    0,    0,    89,   1371, 0,    3211, 0,    0,    0,    0,    0,    3291, 3936, 0,
        655,  0,    1690, 0,    2957, 3665, 1797, 260,  0,    0,    0,    0,    1460, 0,    0,    2545,
        4035, 0,    1079, 0,    3927, 2264, 808,  408,  1743, 1647, 437,  103,  0,    0,    0,    91,
        44,   2086, 1969, 0,    0,    0,    3659, 1685, 1853, 715,  0,    0,    0,    0,    0,    3729,
        2033, 0,    3103, 0,    968,  507,  3254, 0,    395,  0,    0,    713,  0,    0,    0,    0,
        443,  1615, 188,  1073, 0,    2244, 2942, 3028, 393,  0,    1887, 3154, 1267, 147,  0,    732,
        1294, 3746, 0,    0,    1804, 456,  203,  560,  3839, 0,    0,    0,    1111, 0,    296,  1895,
        0,    0,    0,    1403, 211,  1343, 0,    0,    811,  2599, 0,    389,  113,  0,    2006, 0,
        3570, 0,    0,    1524, 0,    0,    2100, 541,  0,    1118, 4012, 1427, 548,  0,    0,    0,
        980,  3603, 0,    3076, 314,  0,    0,    0,    0,    1265, 0,    1527, 3779, 0,    1568, 3960,
        0,    2924, 0,    923,  181,  0,    1236, 1315, 1287, 0,    3548, 2919, 1517, 0,    1968, 0,
        0,    0,    0,    0,    0,    0,    1257, 0,    0,    945,  1365, 0,    191,  2323, 1969, 150,
        1569, 0,    505,  0,    218,  0,    0,    0,    0,    0,    1132, 917,  0,    3405, 0,    0,
        0,    0,    2460, 607,  787,  1367, 0,    298,  0,    0,    0,    3058, 636,  1333, 1958, 2745,
        0,    0,    0,    0,    361,  487,  0,    0,    1404, 0,    0,    0,    92,   979,  2156, 0,
        0,    1870, 3330, 0,    1056, 0,    851,  4167, 0,    0,    0,    2671, 0,    4153, 4094, 583,
        0,    1196, 3386, 1149, 757,  0,    3577, 58,   3160, 0,    152,  4120, 1014, 1857, 0,    0,
        0,    0,    0,    565,  0,    2257, 1844, 0,    0,    0,    3895, 4008, 0,    2090, 189,  0,
        2126, 0,    0,    0,    0,    0,    699,  340,  0,    0,    3468, 0,    2560, 0,    3039, 345,
        1407, 535,  1182, 1582, 0,    1980, 622,  1096, 1242, 2743, 0,    3728, 0,    0,    0,    862,
        1890, 725,  1525, 1353, 391,  2963, 1533, 3669, 539,  683,  0,    3722, 0,    0,    0,    0,
        1210, 3635, 3621, 3379, 235,  2850, 0,    0,    0,    1244, 0,    0,    0,    202,  31,   1214,
        3943, 0,    0,    3683, 0,    1623, 0,    1689, 0,    2290, 379,  646,  0,    0,    0,    0,
        0,    1334, 0,    0,    356,  488,  811,  0,    821,  0,    0,    1957, 0,    0,    0,    0,
        894,  0,    0,    0,    0,    1563, 863,  0,    2492, 260,  0,    3471, 294,  369,  1786, 0,
        3652, 2809, 3063, 2078, 1703, 0,    439,  703,  269,  1573, 0,    3936, 835,  478,  853,  0,
        0,    3400, 2005, 591,  0,    1621, 0,    1618, 0,    941,  0,    0,    1463, 2648, 0,    1725,
        0,    0,    0,    4124, 0,    158,  1095, 0,    2774, 1117, 0,    238,  0,    0,    193,  1669,
        1883, 1629, 0,    1053, 3724, 2544, 0,    0,    0,    2303, 0,    1179, 593,  0,    1764, 3298,
        0,    1467, 2817, 1379, 226,  1045, 0,    0,    2258, 101,  3834, 0,    0,    0,    1037, 1187,
        1939, 95,   0,    0,    4012, 20,   0,    3858, 0,    1020, 1265, 0,    3873, 0,    792,  1955,
        1414, 4035, 127,  0,    843,  145,  2295, 0,    3395, 0,    3710, 1027, 3566, 266,  1103, 3282,
        0,    0,    0,    1259, 1700, 0,    812,  0,    1062, 1125, 0,    1619, 0,    1548, 1229, 0,
        1530, 0,    3151, 0,    3815, 0,    0,    0,    2786, 1824, 3905, 3041, 0,    258,  1168, 0,
        524,  3063, 497,  1989, 1553, 802,  0,    2884, 2795, 603,  0,    1235, 827,  0,    0,    0,
        608,  1351, 0,    1625, 0,    0,    0,    135,  1541, 0,    1348, 0,    0,    1624, 2415, 942,
        0,    0,    1438, 0,    2083, 949,  0,    0,    3961, 106,  3750, 3482, 0,    1487, 0,    0,
        3280, 0,    0,    937,  2393, 0,    495,  3233, 0,    1059, 15,   1724, 135,  1060, 1317, 2253,
        3412, 81,   350,  0,    0,    1082, 1844, 0,    179,  781,  0,    2197, 0,    3815, 1441, 0,
        0,    1503, 0,    0,    3184, 0,    0,    0,    3652, 0,    0,    0,    0,    0,    0,    443,
        0,    1500, 0,    174,  0,    0,    1835, 0,    1560, 3486, 3881, 0,    114,  0,    1151, 1172,
        0,    2247, 3438, 4001, 0,    4141, 2614, 0,    4171, 4128, 0,    0,    2689, 0,    1574, 1309,
        712,  0,    1653, 0,    0,    2542, 1586, 0,    0,    0,    0,    0,    525,  3832, 730,  105,
        3645, 245,  0,    736,  3598, 318,  0,    772,  960,  1951, 1144, 1345, 364,  765,  0,    2882,
        116,  0,    67,   984,  2948, 0,    359,  0,    0,    3472, 700,  1317, 0,    204,  0,    0,
        0,    1828, 926,  0,    2654, 2439, 0,    0,    1446, 734,  0,    82,   848,  2400, 0,    0,
        416,  0,    1172, 0,    2967, 0,    282,  0,    0,    0,    855,  169,  3869, 1485, 1374, 0,
        1294, 1705, 0,    1055, 0,    1072, 0,    1211, 0,    1568, 0,    2105, 0,    1733, 0,    2187,
        0,    3134, 0,    881,  610,  0,    896,  0,    3,    3388, 238,  1207, 0,    0,    0,    709,
        0,    0,    0,    0,    2210, 0,    0,    0,    0,    0,    661,  0,    237,  0,    1026, 0,
        0,    1998, 0,    0,    1225, 1071, 0,    0,    0,    2576, 0,    1103, 3258, 2489, 1986, 640,
        989,  60,   0,    0,    0,    579,  0,    0,    1616, 1855, 4204, 0,    0,    0,    901,  0,
        2733, 0,    920,  1694, 761,  0,    0,    0,    886,  1862, 1532, 1613, 2566, 860,  0,    0,
        0,    0,    0,    3752, 37,   0,    0,    0,    0,    311,  4022, 649,  487,  0,    1519, 3577,
        1108, 0,    1060, 1884, 774,  0,    1102, 0,    201,  0,    171,  0,    245,  830,  3550, 0,
        0,    964,  1086, 0,    1534, 709,  0,    0,    0,    0,    1919, 0,    1606, 1829, 3207, 3809,
        883,  1523, 0,    1554, 0,    627,  960,  0,    216,  0,    0,    2129, 0,    1789, 0,    0,
        1331, 1665, 0,    3490, 0,    3383, 0,    0,    3913, 3396, 3731, 411,  0,    0,    0,    0,
        393,  0,    3546, 3555, 2042, 2055, 1441, 840,  1566, 2818, 0,    0,    1325, 0,    0,    0,
        0,    0,    0,    3967, 3633, 0,    3378, 0,    0,    1194, 0,    0,    0,    2366, 3010, 0,
        1170, 0,    814,  0,    2831, 857,  0,    1466, 22,   1028, 845,  1199, 0,    2027, 3598, 0,
        2005, 1777, 697,  8,    140,  12,   3608, 3119, 0,    1495, 571,  1716, 0,    1164, 1933, 4144,
        1353, 0,    0,    0,    108,  1661, 414,  0,    0,    813,  0,    1345, 1506, 0,    0,    0,
        0,    0,    1729, 796,  1901, 0,    1084, 0,    0,    0,    1601, 0,    1134, 0,    1379, 2446,
        0,    3131, 550,  3623, 2991, 696,  0,    0,    0,    0,    118,  0,    268,  0,    2478, 362,
        2607, 2521, 956,  0,    0,    0,    0,    916,  0,    0,    0,    1159, 0,    0,    981,  0,
        2665, 4136, 2825, 235,  1567, 0,    0,    0,    0,    1515, 0,    199,  3945, 3557, 561,  730,
        669,  0,    327,  560,  1762, 1119, 1762, 2497, 1712, 1657, 0,    2874, 0,    0,    62,   0,
        380,  0,    3258, 1331, 1752, 155,  0,    0,    1127, 977,  1098, 1583, 3781, 0,    898,  0,
        1794, 0,    0,    42,   2109, 1540, 3643, 0,    781,  0,    891,  1174, 1021, 2057, 2745, 3512,
        0,    0,    0,    2673, 1352, 1332, 4150, 0,    3778, 2352, 0,    0,    330,  0,    0,    2516,
        2844, 0,    3250, 1641, 0,    93,   1045, 1265, 470,  928,  2668, 1553, 0,    0,    340,  944,
        1436, 2486, 0,    0,    3190, 0,    2778, 2224, 960,  2626, 1874, 0,    0,    0,    1942, 3019,
        73,   905,  0,    3585, 372,  697,  0,    1620, 0,    2541, 2048, 661,  0,    1590, 4078, 0,
        195,  3461, 1630, 776,  135,  1357, 0,    828,  255,  2326, 0,    4162, 3244, 0,    430,  3752,
        1405, 3362, 313,  0,    0,    1637, 0,    1632, 0,    907,  0,    2182, 1187, 3224, 0,    1456,
        3018, 0,    0,    0,    0,    3602, 0,    0,    828,  1320, 201,  1570, 1784, 0,    0,    0,
        2009, 3763, 3258, 0,    0,    0,    1568, 1026, 2794, 0,    675,  1852, 0,    0,    176,  0,
        4078, 1846, 360,  2249, 1745, 549,  0,    1141, 1062, 2069, 0,    4096, 1070, 2440, 987,  0,
        0,    0,    0,    2539, 3712, 4164, 1689, 0,    655,  2108, 543,  1394, 3389, 576,  246,  1379,
        3556, 0,    58,   2390, 0,    0,    0,    1347, 989,  1170, 1049, 0,    290,  300,  3076, 3691,
        0,    140,  3363, 3757, 2094, 0,    0,    2537, 1655, 3695, 1029, 2029, 1003, 0,    223,  4022,
        617,  599,  0,    0,    1543, 463,  1320, 0,    1543, 506,  1495, 4200, 0,    1490, 471,  1544,
        253,  1555, 1748, 770,  0,    910,  1302, 1471, 0,    1581, 1243, 147,  1785, 2532, 2073, 624,
        0,    390,  0,    0,    0,    131,  2981, 0,    1654, 0,    0,    2075, 0,    0,    3459, 1129,
        2197, 0,    885,  2812, 0,    1141, 712,  0,    0,    507,  138,  0,    0,    0,    311,  2789,
        1593, 0,    484,  0,    1025, 730,  0,    562,  368,  2012, 2084, 3266, 974,  28,   1297, 0,
        0,    554,  3968, 592,  1707, 3952, 378,  344,  3953, 1949, 1649, 1203, 0,    855,  1184, 0,
        0,    830,  1027, 78,   962,  1956, 1157, 2425, 1215, 0,    2064, 3283, 457,  1541, 2448, 0,
        1729, 2026, 0,    0,    3251, 4085, 642,  0,    1395, 1905, 561,  1657, 2911, 0,    257,  1571,
        0,    702,  1959, 0,    723,  974,  1439, 1701, 4146, 0,    3223, 3251, 58,   4174, 84,   0,
        0,    184,  0,    0,    1346, 0,    474,  0,    0,    2969, 0,    262,  653,  3307, 1196, 0,
        1646, 1570, 0,    532,  3472, 0,    1082, 0,    0,    902,  806,  1955, 1437, 0,    1571, 2087,
        0,    0,    0,    0,    989,  1251, 670,  3088, 0,    2826, 126,  953,  883,  1617, 29,   2433,
        3934, 49,   259,  0,    633,  1128, 0,    13,   800,  3710, 0,    1747, 0,    1335, 340,  1665,
        2867, 596,  0,    0,    1562, 834,  0,    0,    1106, 0,    214,  1089, 1482, 563,  1057, 0,
        0,    299,  822,  2953, 0,    0,    2363, 0,    0,    90,   4110, 0,    0,    447,  1000, 0,
        3614, 1623, 0,    0,    0,    1455, 1362, 1598, 0,    1242, 1256, 1421, 0,    3228, 0,    0,
        0,    842,  644,  1273, 0,    0,    1496, 0,    682,  0,    2848, 0,    3132, 282,  496,  863,
        317,  2237, 1338, 0,    2009, 0,    2337, 0,    0,    716,  0,    3232, 1395, 65,   2974, 1924,
        166,  0,    0,    1408, 346,  1478, 145,  1625, 4108, 458,  1414, 3191, 3576, 0,    0,    1880,
        0,    0,    0,    0,    1119, 0,    2010, 0,    3534, 3006, 3166, 0,    0,    3230, 0,    2874,
        0,    2460, 1910, 0,    0,    2390, 3976, 1812, 2064, 0,    3288, 0,    238,  0,    962,  3904,
        464,  4026, 3899, 0,    2095, 0,    391,  640,  1720, 1946, 3045, 0,    769,  87,   1673, 1807,
        3500, 0,    3493, 1264, 0,    1609, 3771, 0,    4180, 0,    0,    0,    1851, 2314, 194,  2836,
        2028, 3790, 0,    0,    0,    0,    0,    750,  1581, 0,    1009, 1744, 0,    0,    0,    1258,
        831,  843,  0,    419,  522,  527,  1040, 752,  0,    1359, 0,    2638, 0,    3415, 0,    0,
        0,    130,  0,    1033, 0,    22,   1368, 0,    672,  267,  3401, 0,    86,   1717, 1574, 308,
        1859};
    
    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 %= 4209;
        }
        return mangledkG[sum];
    }
    
    int MangledPerfectHash(const char *key)
    {
        if (strlen(key) > 37)
            return 0;
    
        return (MangledHashG(key, mangledkT1) + MangledHashG(key, mangledkT2)) % 4209;
    }
    
    constexpr int unmangledkT1[] = {9,   1,  58,  119, 163, 183, 256, 133, 308, 258, 318, 25,  17,
                                    153, 50, 219, 51,  187, 41,  19,  41,  321, 197, 5,   306, 230};
    constexpr int unmangledkT2[] = {275, 243, 153, 329, 122, 53,  291, 152, 285, 154, 277, 272, 275,
                                    37,  143, 113, 122, 164, 310, 151, 163, 178, 240, 308, 36,  167};
    constexpr int unmangledkG[]  = {
        0,   0,   0,   254, 0,   0,   0,   201, 0,   0,   0,   0,   0,   181, 0,   207, 0,   0,   2,
        0,   0,   0,   0,   0,   0,   0,   0,   173, 0,   240, 179, 0,   0,   0,   0,   38,  0,   195,
        296, 0,   0,   0,   0,   58,  0,   300, 183, 143, 45,  294, 90,  0,   0,   288, 0,   166, 0,
        0,   7,   24,  0,   0,   225, 0,   179, 0,   252, 0,   0,   207, 0,   38,  101, 0,   0,   284,
        0,   23,  222, 79,  299, 1,   113, 0,   77,  138, 128, 0,   177, 33,  197, 150, 0,   27,  319,
        193, 0,   65,  143, 69,  0,   298, 300, 0,   135, 230, 0,   0,   9,   0,   0,   278, 314, 0,
        0,   0,   67,  0,   0,   23,  0,   218, 0,   0,   280, 182, 206, 76,  0,   0,   0,   186, 123,
        5,   53,  0,   0,   0,   116, 188, 179, 0,   107, 276, 0,   0,   73,  297, 287, 284, 0,   142,
        196, 262, 256, 169, 231, 35,  0,   0,   0,   165, 204, 106, 199, 48,  0,   0,   90,  0,   251,
        295, 132, 0,   259, 0,   141, 0,   0,   0,   0,   74,  111, 51,  323, 253, 0,   0,   18,  145,
        278, 36,  311, 0,   0,   16,  277, 267, 0,   117, 0,   82,  0,   189, 0,   63,  158, 78,  136,
        19,  75,  315, 0,   281, 86,  0,   313, 265, 304, 289, 139, 129, 221, 257, 153, 137, 0,   220,
        231, 65,  157, 99,  2,   0,   1,   109, 5,   238, 132, 204, 0,   42,  224, 329, 0,   0,   203,
        82,  0,   102, 173, 0,   188, 47,  0,   41,  111, 136, 202, 62,  0,   0,   72,  131, 0,   0,
        270, 195, 136, 0,   244, 0,   166, 146, 106, 5,   24,  168, 0,   55,  79,  204, 153, 0,   158,
        0,   0,   325, 0,   0,   204, 155, 199, 112, 0,   305, 61,  58,  251, 0,   194, 0,   108, 150,
        2,   34,  144, 157, 275, 0,   120, 199, 230, 11,  85,  180, 0,   255, 284, 39,  156, 124, 12,
        177, 0,   34,  0,   10,  176, 0,   44};
    
    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 %= 331;
        }
        return unmangledkG[sum];
    }
    
    int UnmangledPerfectHash(const char *key)
    {
        if (strlen(key) > 26)
            return 0;
    
        return (UnmangledHashG(key, unmangledkT1) + UnmangledHashG(key, unmangledkT2)) % 331;
    }
    
    }  // 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