15dda2efdSMircea Trofin #include <cassert>
25dda2efdSMircea Trofin #include <iostream>
35dda2efdSMircea Trofin #include <set>
45dda2efdSMircea Trofin #include <vector>
55dda2efdSMircea Trofin
6a290770fSMircea Trofin #include "benchmark/benchmark.h"
7a290770fSMircea Trofin
85dda2efdSMircea Trofin class MultipleRangesFixture : public ::benchmark::Fixture {
95dda2efdSMircea Trofin public:
MultipleRangesFixture()105dda2efdSMircea Trofin MultipleRangesFixture()
115dda2efdSMircea Trofin : expectedValues({{1, 3, 5},
125dda2efdSMircea Trofin {1, 3, 8},
135dda2efdSMircea Trofin {1, 3, 15},
145dda2efdSMircea Trofin {2, 3, 5},
155dda2efdSMircea Trofin {2, 3, 8},
165dda2efdSMircea Trofin {2, 3, 15},
175dda2efdSMircea Trofin {1, 4, 5},
185dda2efdSMircea Trofin {1, 4, 8},
195dda2efdSMircea Trofin {1, 4, 15},
205dda2efdSMircea Trofin {2, 4, 5},
215dda2efdSMircea Trofin {2, 4, 8},
225dda2efdSMircea Trofin {2, 4, 15},
235dda2efdSMircea Trofin {1, 7, 5},
245dda2efdSMircea Trofin {1, 7, 8},
255dda2efdSMircea Trofin {1, 7, 15},
265dda2efdSMircea Trofin {2, 7, 5},
275dda2efdSMircea Trofin {2, 7, 8},
285dda2efdSMircea Trofin {2, 7, 15},
295dda2efdSMircea Trofin {7, 6, 3}}) {}
305dda2efdSMircea Trofin
SetUp(const::benchmark::State & state)31*a5b79717SMircea Trofin void SetUp(const ::benchmark::State& state) override {
325dda2efdSMircea Trofin std::vector<int64_t> ranges = {state.range(0), state.range(1),
335dda2efdSMircea Trofin state.range(2)};
345dda2efdSMircea Trofin
355dda2efdSMircea Trofin assert(expectedValues.find(ranges) != expectedValues.end());
365dda2efdSMircea Trofin
375dda2efdSMircea Trofin actualValues.insert(ranges);
385dda2efdSMircea Trofin }
395dda2efdSMircea Trofin
405dda2efdSMircea Trofin // NOTE: This is not TearDown as we want to check after _all_ runs are
415dda2efdSMircea Trofin // complete.
~MultipleRangesFixture()42*a5b79717SMircea Trofin ~MultipleRangesFixture() override {
435dda2efdSMircea Trofin if (actualValues != expectedValues) {
445dda2efdSMircea Trofin std::cout << "EXPECTED\n";
45a290770fSMircea Trofin for (const auto& v : expectedValues) {
465dda2efdSMircea Trofin std::cout << "{";
475dda2efdSMircea Trofin for (int64_t iv : v) {
485dda2efdSMircea Trofin std::cout << iv << ", ";
495dda2efdSMircea Trofin }
505dda2efdSMircea Trofin std::cout << "}\n";
515dda2efdSMircea Trofin }
525dda2efdSMircea Trofin std::cout << "ACTUAL\n";
53a290770fSMircea Trofin for (const auto& v : actualValues) {
545dda2efdSMircea Trofin std::cout << "{";
555dda2efdSMircea Trofin for (int64_t iv : v) {
565dda2efdSMircea Trofin std::cout << iv << ", ";
575dda2efdSMircea Trofin }
585dda2efdSMircea Trofin std::cout << "}\n";
595dda2efdSMircea Trofin }
605dda2efdSMircea Trofin }
615dda2efdSMircea Trofin }
625dda2efdSMircea Trofin
635dda2efdSMircea Trofin std::set<std::vector<int64_t>> expectedValues;
645dda2efdSMircea Trofin std::set<std::vector<int64_t>> actualValues;
655dda2efdSMircea Trofin };
665dda2efdSMircea Trofin
BENCHMARK_DEFINE_F(MultipleRangesFixture,Empty)675dda2efdSMircea Trofin BENCHMARK_DEFINE_F(MultipleRangesFixture, Empty)(benchmark::State& state) {
685dda2efdSMircea Trofin for (auto _ : state) {
695dda2efdSMircea Trofin int64_t product = state.range(0) * state.range(1) * state.range(2);
705dda2efdSMircea Trofin for (int64_t x = 0; x < product; x++) {
715dda2efdSMircea Trofin benchmark::DoNotOptimize(x);
725dda2efdSMircea Trofin }
735dda2efdSMircea Trofin }
745dda2efdSMircea Trofin }
755dda2efdSMircea Trofin
765dda2efdSMircea Trofin BENCHMARK_REGISTER_F(MultipleRangesFixture, Empty)
775dda2efdSMircea Trofin ->RangeMultiplier(2)
785dda2efdSMircea Trofin ->Ranges({{1, 2}, {3, 7}, {5, 15}})
795dda2efdSMircea Trofin ->Args({7, 6, 3});
805dda2efdSMircea Trofin
BM_CheckDefaultArgument(benchmark::State & state)815dda2efdSMircea Trofin void BM_CheckDefaultArgument(benchmark::State& state) {
825dda2efdSMircea Trofin // Test that the 'range()' without an argument is the same as 'range(0)'.
835dda2efdSMircea Trofin assert(state.range() == state.range(0));
845dda2efdSMircea Trofin assert(state.range() != state.range(1));
855dda2efdSMircea Trofin for (auto _ : state) {
865dda2efdSMircea Trofin }
875dda2efdSMircea Trofin }
885dda2efdSMircea Trofin BENCHMARK(BM_CheckDefaultArgument)->Ranges({{1, 5}, {6, 10}});
895dda2efdSMircea Trofin
BM_MultipleRanges(benchmark::State & st)905dda2efdSMircea Trofin static void BM_MultipleRanges(benchmark::State& st) {
915dda2efdSMircea Trofin for (auto _ : st) {
925dda2efdSMircea Trofin }
935dda2efdSMircea Trofin }
945dda2efdSMircea Trofin BENCHMARK(BM_MultipleRanges)->Ranges({{5, 5}, {6, 6}});
955dda2efdSMircea Trofin
965dda2efdSMircea Trofin BENCHMARK_MAIN();
97