[flang][runtime] Make defined formatted I/O process format elementally (#74150)
[llvm-project.git] / libcxx / benchmarks / VariantBenchmarks.h
bloba8e9c9febd7280988c41ddd4911667f00adc5698
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
10 #ifndef BENCHMARK_VARIANT_BENCHMARKS_H
11 #define BENCHMARK_VARIANT_BENCHMARKS_H
13 #include <array>
14 #include <cstddef>
15 #include <tuple>
16 #include <type_traits>
17 #include <variant>
19 #include "benchmark/benchmark.h"
21 #include "GenerateInput.h"
23 namespace VariantBenchmarks {
25 template <std::size_t I>
26 struct S {
27 static constexpr size_t v = I;
30 template <std::size_t N, std::size_t... Is>
31 static auto genVariants(std::index_sequence<Is...>) {
32 using V = std::variant<S<Is>...>;
33 using F = V (*)();
34 static constexpr F fs[] = {[] { return V(std::in_place_index<Is>); }...};
36 std::array<V, N> result = {};
37 for (auto& v : result) {
38 v = fs[getRandomInteger(0ul, sizeof...(Is) - 1)]();
41 return result;
44 template <std::size_t N, std::size_t Alts>
45 static void BM_Visit(benchmark::State& state) {
46 auto args = genVariants<N>(std::make_index_sequence<Alts>{});
47 for (auto _ : state) {
48 benchmark::DoNotOptimize(
49 std::apply([](auto... vs) { return std::visit([](auto... is) { return (is.v + ... + 0); }, vs...); }, args));
53 } // end namespace VariantBenchmarks
55 #endif // BENCHMARK_VARIANT_BENCHMARKS_H