2 //===----------------------------------------------------------------------===//
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
8 //===----------------------------------------------------------------------===//
10 #ifndef BENCHMARK_VARIANT_BENCHMARKS_H
11 #define BENCHMARK_VARIANT_BENCHMARKS_H
16 #include <type_traits>
19 #include "benchmark/benchmark.h"
21 #include "GenerateInput.h"
23 namespace VariantBenchmarks
{
25 template <std::size_t I
>
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
>...>;
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)]();
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