// Copyright 2022 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/lang/core/address_space_bench.cc.tmpl
//
// To regenerate run: './tools/run gen'
//
//                       Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#include "src/tint/lang/core/address_space.h"

#include <array>

#include "benchmark/benchmark.h"

namespace tint::core {
namespace {

void AddressSpaceParser(::benchmark::State& state) {
    const char* kStrings[] = {
        "ccin",
        "3",
        "_Vin",
        "__in",
        "1_in",
        "_qiJ",
        "_lli77",
        "__qHupp",
        "vt",
        "G_bt",
        "__out",
        "__viut",
        "__8WWt",
        "Mxxou",
        "fuXggton",
        "fuXtou",
        "funct3on",
        "function",
        "funEtion",
        "PPncTTion",
        "xxuncddon",
        "pixe44_local",
        "SSVVxel_local",
        "pixRR_local",
        "pixel_local",
        "pixel_lF9a",
        "pixel_loca",
        "pOOxVRl_locH",
        "prvaye",
        "llnrrrv77te",
        "priv4t00",
        "private",
        "rvooe",
        "zzvate",
        "piiippa1",
        "puXXh_constant",
        "pusII9_nn55nstant",
        "YusHH_coaastSSrnt",
        "push_constant",
        "pushonkkHan",
        "jush_consgRt",
        "puh_cobsant",
        "storaje",
        "torage",
        "qrage",
        "storage",
        "stoNNge",
        "torgvv",
        "QQorage",
        "unffor",
        "unifojm",
        "uNNwfor8",
        "uniform",
        "uniorm",
        "urriform",
        "Gniform",
        "workgrFFup",
        "Eokgru",
        "worrgroup",
        "workgroup",
        "wokgrou",
        "woJDkgoup",
        "okroup",
    };
    for (auto _ : state) {
        for (auto* str : kStrings) {
            auto result = ParseAddressSpace(str);
            benchmark::DoNotOptimize(result);
        }
    }
}  // NOLINT(readability/fn_size)

BENCHMARK(AddressSpaceParser);

}  // namespace
}  // namespace tint::core
