// 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/ast/extension_bench.cc.tmpl
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#include "src/tint/ast/extension.h"

#include <array>

#include "benchmark/benchmark.h"

namespace tint::ast {
namespace {

void ExtensionParser(::benchmark::State& state) {
    std::array kStrings{
        "chromium_disableuniformiccy_analysis",
        "chromil3_disable_unifority_analss",
        "chromium_disable_Vniformity_analysis",
        "chromium_disable_uniformity_analysis",
        "chromium_dis1ble_uniformity_analysis",
        "chromium_qqisable_unifomity_anaJysis",
        "chrollium_disable_uniformity_analysi77",
        "chromippHm_experqqmetal_dp4a",
        "chrmium_expecimntal_dp4",
        "chrmiumGexpebimental_dp4a",
        "chromium_experimental_dp4a",
        "chromium_exverimentiil_dp4a",
        "chro8ium_experimenWWal_dp4a",
        "chromiMm_eperimxxntal_dp4a",
        "chrXmium_experimeggtal_ush_constant",
        "chromiu_experVmentalpusX_constant",
        "chro3ium_experimental_push_constant",
        "chromium_experimental_push_constant",
        "chromium_experEmental_push_constant",
        "chPPomiumexperimental_push_conTTtant",
        "chromixxm_experimentddl_push_constnt",
        "4416",
        "fSVV6",
        "RR2",
        "f16",
        "96",
        "f1",
        "VOR6",
    };
    for (auto _ : state) {
        for (auto& str : kStrings) {
            auto result = ParseExtension(str);
            benchmark::DoNotOptimize(result);
        }
    }
}

BENCHMARK(ExtensionParser);

}  // namespace
}  // namespace tint::ast
