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//===----------------------------------------------------------------------===// 9 10#ifndef BENCHMARK_VARIANT_BENCHMARKS_H 11#define BENCHMARK_VARIANT_BENCHMARKS_H 12 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(0ul, 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(std::apply( 49 [](auto... vs) { 50 return std::visit([](auto... is) { return (is.v + ... + 0); }, vs...); 51 }, 52 args)); 53 } 54} 55 56} // end namespace VariantBenchmarks 57 58#endif // BENCHMARK_VARIANT_BENCHMARKS_H 59