// Copyright 2023 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

////////////////////////////////////////////////////////////////////////////////
// File generated by tools/src/cmd/gen
// using the template:
//   src/tint/builtin/attribute_bench.cc.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#include "src/tint/builtin/attribute.h"

#include <array>

#include "benchmark/benchmark.h"

namespace tint::builtin {
namespace {

void AttributeParser(::benchmark::State& state) {
    const char* kStrings[] = {
        "alccn",
        "3g",
        "aVign",
        "align",
        "alig1",
        "qqlJn",
        "alill7n",
        "ppqqndnHH",
        "bicv",
        "bndiGg",
        "binding",
        "bindiivg",
        "8WWnding",
        "bxxding",
        "bXltigg",
        "ultXn",
        "buil3in",
        "builtin",
        "Euiltin",
        "bPTTltin",
        "builtdxx",
        "c44mpute",
        "coSSpuVVe",
        "RomR22e",
        "compute",
        "cFpu9e",
        "comute",
        "VOORRHte",
        "dyagnstic",
        "d77agnnnsllrrc",
        "dia400ostic",
        "diagnostic",
        "danstooc",
        "dignszzic",
        "d11ansppiic",
        "XXragment",
        "fIIa9955nnnt",
        "aarHHgmenYSS",
        "fragment",
        "fkkaet",
        "gjamRRn",
        "fabmnt",
        "gjoup",
        "goup",
        "goq",
        "group",
        "Nroup",
        "govv",
        "gruQQ",
        "r",
        "jd",
        "NNw",
        "id",
        "i",
        "rrd",
        "iG",
        "inFFex",
        "iE",
        "inrrx",
        "index",
        "inx",
        "inJJD",
        "ie",
        "inerpklae",
        "intrpolate",
        "inJerpolae",
        "interpolate",
        "interpocate",
        "interpolaOe",
        "__nttevvpoKKate",
        "xnvari5n8",
        "inFq__ant",
        "iqqariant",
        "invariant",
        "invar6a33O",
        "i96arQttanoo",
        "inari66nt",
        "lOxati6zz",
        "locyytion",
        "lHHtion",
        "location",
        "qWW4caton",
        "locOOton",
        "ocatiYn",
        "m_use",
        "mutFuse",
        "wust_us",
        "must_use",
        "Kst_sff",
        "qusKK_use",
        "mFsmm_3se",
        "ize",
        "sze",
        "sbbb",
        "size",
        "iie",
        "siqe",
        "svvTTe",
        "vertFFx",
        "vrQ00P",
        "vePtex",
        "vertex",
        "vsste77",
        "veCtRRbb",
        "verteXX",
        "workgqou_siCCOOO",
        "worsgroupsuzL",
        "wXrkgroup_size",
        "workgroup_size",
        "workgroup_sze",
        "wqqrOgoupize",
        "workg22oup_size",
    };
    for (auto _ : state) {
        for (auto* str : kStrings) {
            auto result = ParseAttribute(str);
            benchmark::DoNotOptimize(result);
        }
    }
}  // NOLINT(readability/fn_size)

BENCHMARK(AttributeParser);

}  // namespace
}  // namespace tint::builtin
