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