1a8c51b3fSopenharmony_ci#include <cassert>
2a8c51b3fSopenharmony_ci#include <iostream>
3a8c51b3fSopenharmony_ci#include <set>
4a8c51b3fSopenharmony_ci#include <vector>
5a8c51b3fSopenharmony_ci
6a8c51b3fSopenharmony_ci#include "benchmark/benchmark.h"
7a8c51b3fSopenharmony_ci
8a8c51b3fSopenharmony_ciclass ArgsProductFixture : public ::benchmark::Fixture {
9a8c51b3fSopenharmony_ci public:
10a8c51b3fSopenharmony_ci  ArgsProductFixture()
11a8c51b3fSopenharmony_ci      : expectedValues({{0, 100, 2000, 30000},
12a8c51b3fSopenharmony_ci                        {1, 15, 3, 8},
13a8c51b3fSopenharmony_ci                        {1, 15, 3, 9},
14a8c51b3fSopenharmony_ci                        {1, 15, 7, 8},
15a8c51b3fSopenharmony_ci                        {1, 15, 7, 9},
16a8c51b3fSopenharmony_ci                        {1, 15, 10, 8},
17a8c51b3fSopenharmony_ci                        {1, 15, 10, 9},
18a8c51b3fSopenharmony_ci                        {2, 15, 3, 8},
19a8c51b3fSopenharmony_ci                        {2, 15, 3, 9},
20a8c51b3fSopenharmony_ci                        {2, 15, 7, 8},
21a8c51b3fSopenharmony_ci                        {2, 15, 7, 9},
22a8c51b3fSopenharmony_ci                        {2, 15, 10, 8},
23a8c51b3fSopenharmony_ci                        {2, 15, 10, 9},
24a8c51b3fSopenharmony_ci                        {4, 5, 6, 11}}) {}
25a8c51b3fSopenharmony_ci
26a8c51b3fSopenharmony_ci  void SetUp(const ::benchmark::State& state) override {
27a8c51b3fSopenharmony_ci    std::vector<int64_t> ranges = {state.range(0), state.range(1),
28a8c51b3fSopenharmony_ci                                   state.range(2), state.range(3)};
29a8c51b3fSopenharmony_ci
30a8c51b3fSopenharmony_ci    assert(expectedValues.find(ranges) != expectedValues.end());
31a8c51b3fSopenharmony_ci
32a8c51b3fSopenharmony_ci    actualValues.insert(ranges);
33a8c51b3fSopenharmony_ci  }
34a8c51b3fSopenharmony_ci
35a8c51b3fSopenharmony_ci  // NOTE: This is not TearDown as we want to check after _all_ runs are
36a8c51b3fSopenharmony_ci  // complete.
37a8c51b3fSopenharmony_ci  ~ArgsProductFixture() override {
38a8c51b3fSopenharmony_ci    if (actualValues != expectedValues) {
39a8c51b3fSopenharmony_ci      std::cout << "EXPECTED\n";
40a8c51b3fSopenharmony_ci      for (const auto& v : expectedValues) {
41a8c51b3fSopenharmony_ci        std::cout << "{";
42a8c51b3fSopenharmony_ci        for (int64_t iv : v) {
43a8c51b3fSopenharmony_ci          std::cout << iv << ", ";
44a8c51b3fSopenharmony_ci        }
45a8c51b3fSopenharmony_ci        std::cout << "}\n";
46a8c51b3fSopenharmony_ci      }
47a8c51b3fSopenharmony_ci      std::cout << "ACTUAL\n";
48a8c51b3fSopenharmony_ci      for (const auto& v : actualValues) {
49a8c51b3fSopenharmony_ci        std::cout << "{";
50a8c51b3fSopenharmony_ci        for (int64_t iv : v) {
51a8c51b3fSopenharmony_ci          std::cout << iv << ", ";
52a8c51b3fSopenharmony_ci        }
53a8c51b3fSopenharmony_ci        std::cout << "}\n";
54a8c51b3fSopenharmony_ci      }
55a8c51b3fSopenharmony_ci    }
56a8c51b3fSopenharmony_ci  }
57a8c51b3fSopenharmony_ci
58a8c51b3fSopenharmony_ci  std::set<std::vector<int64_t>> expectedValues;
59a8c51b3fSopenharmony_ci  std::set<std::vector<int64_t>> actualValues;
60a8c51b3fSopenharmony_ci};
61a8c51b3fSopenharmony_ci
62a8c51b3fSopenharmony_ciBENCHMARK_DEFINE_F(ArgsProductFixture, Empty)(benchmark::State& state) {
63a8c51b3fSopenharmony_ci  for (auto _ : state) {
64a8c51b3fSopenharmony_ci    int64_t product =
65a8c51b3fSopenharmony_ci        state.range(0) * state.range(1) * state.range(2) * state.range(3);
66a8c51b3fSopenharmony_ci    for (int64_t x = 0; x < product; x++) {
67a8c51b3fSopenharmony_ci      benchmark::DoNotOptimize(x);
68a8c51b3fSopenharmony_ci    }
69a8c51b3fSopenharmony_ci  }
70a8c51b3fSopenharmony_ci}
71a8c51b3fSopenharmony_ci
72a8c51b3fSopenharmony_ciBENCHMARK_REGISTER_F(ArgsProductFixture, Empty)
73a8c51b3fSopenharmony_ci    ->Args({0, 100, 2000, 30000})
74a8c51b3fSopenharmony_ci    ->ArgsProduct({{1, 2}, {15}, {3, 7, 10}, {8, 9}})
75a8c51b3fSopenharmony_ci    ->Args({4, 5, 6, 11});
76a8c51b3fSopenharmony_ci
77a8c51b3fSopenharmony_ciBENCHMARK_MAIN();
78