// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// TODO(CF-260): De-dup this and ../zircon_benchmarks/test_runner.cc/.h

#pragma once

#include <perftest/perftest.h>

namespace fbenchmark {

// Register a benchmark that is specified by a class.
//
// Any class may be used as long as it provides a Run() method that runs an
// iteration of the test.
template <class TestClass, typename... Args>
void RegisterTest(const char* test_name, Args... args) {
  perftest::RegisterTest(test_name, [=](perftest::RepeatState* state) {
    TestClass test(args...);
    while (state->KeepRunning()) {
      test.Run();
    }
    return true;
  });
}

typedef void TestFunc();

// Convenience routine for registering a benchmark that is specified by a
// function.  This is for benchmarks that don't set up any fixtures that
// are shared across invocations of the function.
//
// This takes the function as a template parameter rather than as a value
// parameter in order to avoid the potential cost of an indirect function
// call and hence be consistent with RegisterTest() (which also avoids an
// indirect function call).
template <TestFunc test_func>
void RegisterTestFunc(const char* test_name) {
  class TestClass {
   public:
    void Run() { test_func(); }
  };
  RegisterTest<TestClass>(test_name);
}

}  // namespace fbenchmark
