brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · bb0c714 Raw
56 lines · c
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-exception7//8//===----------------------------------------------------------------------===//9 10#ifndef BENCHMARK_VARIANT_BENCHMARKS_H11#define BENCHMARK_VARIANT_BENCHMARKS_H12 13#include <array>14#include <cstddef>15#include <tuple>16#include <type_traits>17#include <variant>18 19#include "benchmark/benchmark.h"20 21#include "GenerateInput.h"22 23namespace VariantBenchmarks {24 25template <std::size_t I>26struct S {27  static constexpr size_t v = I;28};29 30template <std::size_t N, std::size_t... Is>31static 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>); }...};35 36  std::array<V, N> result = {};37  for (auto& v : result) {38    v = fs[getRandomInteger(std::size_t(0), sizeof...(Is) - 1)]();39  }40 41  return result;42}43 44template <std::size_t N, std::size_t Alts>45static 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));50  }51}52 53} // namespace VariantBenchmarks54 55#endif // BENCHMARK_VARIANT_BENCHMARKS_H56