13b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon#include "benchmark/benchmark.h"
23b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
366bf7c8f7194ecd3b9f6426ca3b4807e8a8996a2Eric Fiselier#include <cassert>
466bf7c8f7194ecd3b9f6426ca3b4807e8a8996a2Eric Fiselier#include <cmath>
566bf7c8f7194ecd3b9f6426ca3b4807e8a8996a2Eric Fiselier#include <cstdint>
6df0df4aba9d5997cdcddcec351ed5b5af180bb88Anton Danielsson#include <cstdlib>
73b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
83b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon#include <iostream>
9efe591015d3316c85d1b1f737dba2b56999885acEric Fiselier#include <limits>
103b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon#include <sstream>
113b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon#include <string>
123b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
133b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamonnamespace {
143b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
15e45252e6f59b55f4bbf22ca4208912b68b6c6a67Eric Fiselierclass TestReporter : public benchmark::ConsoleReporter {
163b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon public:
1720f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier  virtual bool ReportContext(const Context& context) {
183b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon    return ConsoleReporter::ReportContext(context);
193b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  };
203b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
2120f1c0e2a8e692076dd7a5586f73ab8e2d726c12Eric Fiselier  virtual void ReportRuns(const std::vector<Run>& report) {
223b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon    ++count_;
233b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon    ConsoleReporter::ReportRuns(report);
243b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  };
253b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
263b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  TestReporter() : count_(0) {}
273b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
283b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  virtual ~TestReporter() {}
293b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
303b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  size_t GetCount() const {
313b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon    return count_;
323b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  }
333b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
343b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon private:
353b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  mutable size_t count_;
363b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon};
373b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
383b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon}  // end namespace
393b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
40e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
41e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselierstatic void NoPrefix(benchmark::State& state) {
42e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier  while (state.KeepRunning()) {}
433b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon}
44e97a96f9e723bd7bbd239d205132f9462518b332Eric FiselierBENCHMARK(NoPrefix);
453b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
46e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselierstatic void BM_Foo(benchmark::State& state) {
47e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier  while (state.KeepRunning()) {}
483b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon}
49e97a96f9e723bd7bbd239d205132f9462518b332Eric FiselierBENCHMARK(BM_Foo);
50e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
51e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
52e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselierstatic void BM_Bar(benchmark::State& state) {
53e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier  while (state.KeepRunning()) {}
54e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier}
55e97a96f9e723bd7bbd239d205132f9462518b332Eric FiselierBENCHMARK(BM_Bar);
56e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
57e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
58e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselierstatic void BM_FooBar(benchmark::State& state) {
59e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier  while (state.KeepRunning()) {}
60e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier}
61e97a96f9e723bd7bbd239d205132f9462518b332Eric FiselierBENCHMARK(BM_FooBar);
62e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
63e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
64e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselierstatic void BM_FooBa(benchmark::State& state) {
65e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier  while (state.KeepRunning()) {}
66e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier}
67e97a96f9e723bd7bbd239d205132f9462518b332Eric FiselierBENCHMARK(BM_FooBa);
68e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
69e97a96f9e723bd7bbd239d205132f9462518b332Eric Fiselier
703b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
712463339d0b76953eb1d1183a927c5c40bb5c3c30Greg Millerint main(int argc, char* argv[]) {
723b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  benchmark::Initialize(&argc, argv);
733b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
743b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  TestReporter test_reporter;
753b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  benchmark::RunSpecifiedBenchmarks(&test_reporter);
763b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon
776abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson  if (argc == 2) {
786abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson    // Make sure we ran all of the tests
796abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson    std::stringstream ss(argv[1]);
806abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson    size_t expected;
816abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson    ss >> expected;
826abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson
836abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson    const size_t count = test_reporter.GetCount();
846abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson    if (count != expected) {
856abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson      std::cerr << "ERROR: Expected " << expected << " tests to be ran but only "
866abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson                << count << " completed" << std::endl;
876abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson      return -1;
886abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson    }
893b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon  }
906abd53777bf013d5bf6bab2cd1ddce78c3b5b9adAnton Danielsson  return 0;
913b40f0a7a320b5551259be8ffe556996efb006d6Dominic Hamon}
92