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 MultipleRangesFixture : public ::benchmark::Fixture {
9a8c51b3fSopenharmony_ci public:
10a8c51b3fSopenharmony_ci  MultipleRangesFixture()
11a8c51b3fSopenharmony_ci      : expectedValues({{1, 3, 5},
12a8c51b3fSopenharmony_ci                        {1, 3, 8},
13a8c51b3fSopenharmony_ci                        {1, 3, 15},
14a8c51b3fSopenharmony_ci                        {2, 3, 5},
15a8c51b3fSopenharmony_ci                        {2, 3, 8},
16a8c51b3fSopenharmony_ci                        {2, 3, 15},
17a8c51b3fSopenharmony_ci                        {1, 4, 5},
18a8c51b3fSopenharmony_ci                        {1, 4, 8},
19a8c51b3fSopenharmony_ci                        {1, 4, 15},
20a8c51b3fSopenharmony_ci                        {2, 4, 5},
21a8c51b3fSopenharmony_ci                        {2, 4, 8},
22a8c51b3fSopenharmony_ci                        {2, 4, 15},
23a8c51b3fSopenharmony_ci                        {1, 7, 5},
24a8c51b3fSopenharmony_ci                        {1, 7, 8},
25a8c51b3fSopenharmony_ci                        {1, 7, 15},
26a8c51b3fSopenharmony_ci                        {2, 7, 5},
27a8c51b3fSopenharmony_ci                        {2, 7, 8},
28a8c51b3fSopenharmony_ci                        {2, 7, 15},
29a8c51b3fSopenharmony_ci                        {7, 6, 3}}) {}
30a8c51b3fSopenharmony_ci
31a8c51b3fSopenharmony_ci  void SetUp(const ::benchmark::State& state) override {
32a8c51b3fSopenharmony_ci    std::vector<int64_t> ranges = {state.range(0), state.range(1),
33a8c51b3fSopenharmony_ci                                   state.range(2)};
34a8c51b3fSopenharmony_ci
35a8c51b3fSopenharmony_ci    assert(expectedValues.find(ranges) != expectedValues.end());
36a8c51b3fSopenharmony_ci
37a8c51b3fSopenharmony_ci    actualValues.insert(ranges);
38a8c51b3fSopenharmony_ci  }
39a8c51b3fSopenharmony_ci
40a8c51b3fSopenharmony_ci  // NOTE: This is not TearDown as we want to check after _all_ runs are
41a8c51b3fSopenharmony_ci  // complete.
42a8c51b3fSopenharmony_ci  ~MultipleRangesFixture() override {
43a8c51b3fSopenharmony_ci    if (actualValues != expectedValues) {
44a8c51b3fSopenharmony_ci      std::cout << "EXPECTED\n";
45a8c51b3fSopenharmony_ci      for (const auto& v : expectedValues) {
46a8c51b3fSopenharmony_ci        std::cout << "{";
47a8c51b3fSopenharmony_ci        for (int64_t iv : v) {
48a8c51b3fSopenharmony_ci          std::cout << iv << ", ";
49a8c51b3fSopenharmony_ci        }
50a8c51b3fSopenharmony_ci        std::cout << "}\n";
51a8c51b3fSopenharmony_ci      }
52a8c51b3fSopenharmony_ci      std::cout << "ACTUAL\n";
53a8c51b3fSopenharmony_ci      for (const auto& v : actualValues) {
54a8c51b3fSopenharmony_ci        std::cout << "{";
55a8c51b3fSopenharmony_ci        for (int64_t iv : v) {
56a8c51b3fSopenharmony_ci          std::cout << iv << ", ";
57a8c51b3fSopenharmony_ci        }
58a8c51b3fSopenharmony_ci        std::cout << "}\n";
59a8c51b3fSopenharmony_ci      }
60a8c51b3fSopenharmony_ci    }
61a8c51b3fSopenharmony_ci  }
62a8c51b3fSopenharmony_ci
63a8c51b3fSopenharmony_ci  std::set<std::vector<int64_t>> expectedValues;
64a8c51b3fSopenharmony_ci  std::set<std::vector<int64_t>> actualValues;
65a8c51b3fSopenharmony_ci};
66a8c51b3fSopenharmony_ci
67a8c51b3fSopenharmony_ciBENCHMARK_DEFINE_F(MultipleRangesFixture, Empty)(benchmark::State& state) {
68a8c51b3fSopenharmony_ci  for (auto _ : state) {
69a8c51b3fSopenharmony_ci    int64_t product = state.range(0) * state.range(1) * state.range(2);
70a8c51b3fSopenharmony_ci    for (int64_t x = 0; x < product; x++) {
71a8c51b3fSopenharmony_ci      benchmark::DoNotOptimize(x);
72a8c51b3fSopenharmony_ci    }
73a8c51b3fSopenharmony_ci  }
74a8c51b3fSopenharmony_ci}
75a8c51b3fSopenharmony_ci
76a8c51b3fSopenharmony_ciBENCHMARK_REGISTER_F(MultipleRangesFixture, Empty)
77a8c51b3fSopenharmony_ci    ->RangeMultiplier(2)
78a8c51b3fSopenharmony_ci    ->Ranges({{1, 2}, {3, 7}, {5, 15}})
79a8c51b3fSopenharmony_ci    ->Args({7, 6, 3});
80a8c51b3fSopenharmony_ci
81a8c51b3fSopenharmony_civoid BM_CheckDefaultArgument(benchmark::State& state) {
82a8c51b3fSopenharmony_ci  // Test that the 'range()' without an argument is the same as 'range(0)'.
83a8c51b3fSopenharmony_ci  assert(state.range() == state.range(0));
84a8c51b3fSopenharmony_ci  assert(state.range() != state.range(1));
85a8c51b3fSopenharmony_ci  for (auto _ : state) {
86a8c51b3fSopenharmony_ci  }
87a8c51b3fSopenharmony_ci}
88a8c51b3fSopenharmony_ciBENCHMARK(BM_CheckDefaultArgument)->Ranges({{1, 5}, {6, 10}});
89a8c51b3fSopenharmony_ci
90a8c51b3fSopenharmony_cistatic void BM_MultipleRanges(benchmark::State& st) {
91a8c51b3fSopenharmony_ci  for (auto _ : st) {
92a8c51b3fSopenharmony_ci  }
93a8c51b3fSopenharmony_ci}
94a8c51b3fSopenharmony_ciBENCHMARK(BM_MultipleRanges)->Ranges({{5, 5}, {6, 6}});
95a8c51b3fSopenharmony_ci
96a8c51b3fSopenharmony_ciBENCHMARK_MAIN();
97