Make the Benchmark class public (#2101)
Move ::benchmark::internal::Benchmark to ::benchmark::Benchmark.
It's a bit odd that the documented way to pass arguments to a
benchmark is with `benchmark::internal::Benchmark`. Make this
public instead.
https://github.com/google/benchmark/blob/v1.9.4/docs/user_guide.md#passing-arguments
https://raw.githubusercontent.com/google/benchmark/refs/tags/v1.9.4/docs/user_guide.md#:~:text=void%20CustomArguments(benchmark%3A%3A-,internal%3A%3ABenchmark,-*%20b)%20%7B%0A%20%20for%20(int
Keep ::benchmark::internal::Benchmark as a deprecated forwarding alias.
Uses of Benchmark in the internal namespace need to explicitly use
::benchmark::Benchmark to avoid the deprecation warning.
diff --git a/bindings/python/google_benchmark/benchmark.cc b/bindings/python/google_benchmark/benchmark.cc
index 175d351..ccd7eb5 100644
--- a/bindings/python/google_benchmark/benchmark.cc
+++ b/bindings/python/google_benchmark/benchmark.cc
@@ -36,8 +36,8 @@
return remaining_argv;
}
-benchmark::internal::Benchmark* RegisterBenchmark(const std::string& name,
- nb::callable f) {
+benchmark::Benchmark* RegisterBenchmark(const std::string& name,
+ nb::callable f) {
return benchmark::RegisterBenchmark(
name, [f](benchmark::State& state) { f(&state); });
}
@@ -64,7 +64,7 @@
.value("oLambda", BigO::oLambda)
.export_values();
- using benchmark::internal::Benchmark;
+ using benchmark::Benchmark;
nb::class_<Benchmark>(m, "Benchmark")
// For methods returning a pointer to the current object, reference
// return policy is used to ask nanobind not to take ownership of the
diff --git a/docs/user_guide.md b/docs/user_guide.md
index 72fb682..997737f 100644
--- a/docs/user_guide.md
+++ b/docs/user_guide.md
@@ -452,7 +452,7 @@
and a sparse range on the second.
```c++
-static void CustomArguments(benchmark::internal::Benchmark* b) {
+static void CustomArguments(benchmark::Benchmark* b) {
for (int i = 0; i <= 10; ++i)
for (int j = 32; j <= 1024*1024; j *= 8)
b->Args({i, j});
diff --git a/include/benchmark/benchmark.h b/include/benchmark/benchmark.h
index b6153e4..3b20153 100644
--- a/include/benchmark/benchmark.h
+++ b/include/benchmark/benchmark.h
@@ -103,7 +103,7 @@
// arbitrary set of arguments to run the microbenchmark on.
// The following example enumerates a dense range on
// one parameter, and a sparse range on the second.
-static void CustomArguments(benchmark::internal::Benchmark* b) {
+static void CustomArguments(benchmark::Benchmark* b) {
for (int i = 0; i <= 10; ++i)
for (int j = 32; j <= 1024*1024; j *= 8)
b->Args({i, j});
@@ -488,8 +488,9 @@
BENCHMARK_EXPORT
void AddCustomContext(std::string key, std::string value);
-namespace internal {
class Benchmark;
+
+namespace internal {
class BenchmarkImp;
class BenchmarkFamilies;
@@ -1125,20 +1126,15 @@
virtual void RunThreads(const std::function<void(int)>& fn) = 0;
};
-namespace internal {
-
// Define alias of ThreadRunner factory function type
using threadrunner_factory =
std::function<std::unique_ptr<ThreadRunnerBase>(int)>;
-typedef void(Function)(State&);
-
// ------------------------------------------------------
-// Benchmark registration object. The BENCHMARK() macro expands
-// into an internal::Benchmark* object. Various methods can
-// be called on this object to change the properties of the benchmark.
-// Each method returns "this" so that multiple method calls can
-// chained into one expression.
+// Benchmark registration object. The BENCHMARK() macro expands into a
+// Benchmark* object. Various methods can be called on this object to
+// change the properties of the benchmark. Each method returns "this" so
+// that multiple method calls can chained into one expression.
class BENCHMARK_EXPORT Benchmark {
public:
virtual ~Benchmark();
@@ -1352,11 +1348,11 @@
const char* GetArgName(int arg) const;
private:
- friend class BenchmarkFamilies;
- friend class BenchmarkInstance;
+ friend class internal::BenchmarkFamilies;
+ friend class internal::BenchmarkInstance;
std::string name_;
- AggregationReportMode aggregation_report_mode_;
+ internal::AggregationReportMode aggregation_report_mode_;
std::vector<std::string> arg_names_; // Args for all benchmark runs
std::vector<std::vector<int64_t>> args_; // Args for all benchmark runs
@@ -1373,7 +1369,7 @@
bool use_manual_time_;
BigO complexity_;
BigOFunc* complexity_lambda_;
- std::vector<Statistics> statistics_;
+ std::vector<internal::Statistics> statistics_;
std::vector<int> thread_counts_;
callback_function setup_;
@@ -1384,17 +1380,28 @@
BENCHMARK_DISALLOW_COPY_AND_ASSIGN(Benchmark);
};
+namespace internal {
+
+// clang-format off
+typedef BENCHMARK_DEPRECATED_MSG("Use ::benchmark::Benchmark instead")
+ ::benchmark::Benchmark Benchmark;
+typedef BENCHMARK_DEPRECATED_MSG(
+ "Use ::benchmark::threadrunner_factory instead")
+ ::benchmark::threadrunner_factory threadrunner_factory;
+// clang-format on
+
+typedef void(Function)(State&);
+
} // namespace internal
// Create and register a benchmark with the specified 'name' that invokes
// the specified functor 'fn'.
//
// RETURNS: A pointer to the registered benchmark.
-internal::Benchmark* RegisterBenchmark(const std::string& name,
- internal::Function* fn);
+Benchmark* RegisterBenchmark(const std::string& name, internal::Function* fn);
template <class Lambda>
-internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn);
+Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn);
// Remove all registered benchmarks. All pointers to previously registered
// benchmarks are invalidated.
@@ -1403,7 +1410,7 @@
namespace internal {
// The class used to hold all Benchmarks created from static function.
// (ie those created using the BENCHMARK(...) macros.
-class BENCHMARK_EXPORT FunctionBenchmark : public Benchmark {
+class BENCHMARK_EXPORT FunctionBenchmark : public benchmark::Benchmark {
public:
FunctionBenchmark(const std::string& name, Function* func)
: Benchmark(name), func_(func) {}
@@ -1415,7 +1422,7 @@
};
template <class Lambda>
-class LambdaBenchmark : public Benchmark {
+class LambdaBenchmark : public benchmark::Benchmark {
public:
void Run(State& st) override { lambda_(st); }
@@ -1429,15 +1436,15 @@
};
} // namespace internal
-inline internal::Benchmark* RegisterBenchmark(const std::string& name,
- internal::Function* fn) {
+inline Benchmark* RegisterBenchmark(const std::string& name,
+ internal::Function* fn) {
return internal::RegisterBenchmarkInternal(
::benchmark::internal::make_unique<internal::FunctionBenchmark>(name,
fn));
}
template <class Lambda>
-internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn) {
+Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn) {
using BenchType =
internal::LambdaBenchmark<typename std::decay<Lambda>::type>;
return internal::RegisterBenchmarkInternal(
@@ -1446,16 +1453,16 @@
}
template <class Lambda, class... Args>
-internal::Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn,
- Args&&... args) {
+Benchmark* RegisterBenchmark(const std::string& name, Lambda&& fn,
+ Args&&... args) {
return benchmark::RegisterBenchmark(
name, [=](benchmark::State& st) { fn(st, args...); });
}
// The base class for all fixture tests.
-class Fixture : public internal::Benchmark {
+class Fixture : public Benchmark {
public:
- Fixture() : internal::Benchmark("") {}
+ Fixture() : Benchmark("") {}
void Run(State& st) override {
this->SetUp(st);
@@ -1498,10 +1505,10 @@
#define BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method) \
BaseClass##_##Method##_Benchmark
-#define BENCHMARK_PRIVATE_DECLARE(n) \
- /* NOLINTNEXTLINE(misc-use-anonymous-namespace) */ \
- static ::benchmark::internal::Benchmark const* const BENCHMARK_PRIVATE_NAME( \
- n) BENCHMARK_UNUSED
+#define BENCHMARK_PRIVATE_DECLARE(n) \
+ /* NOLINTNEXTLINE(misc-use-anonymous-namespace) */ \
+ static ::benchmark::Benchmark const* const BENCHMARK_PRIVATE_NAME(n) \
+ BENCHMARK_UNUSED
#define BENCHMARK(...) \
BENCHMARK_PRIVATE_DECLARE(_benchmark_) = \
diff --git a/src/benchmark_api_internal.cc b/src/benchmark_api_internal.cc
index 60609d3..f9c4990 100644
--- a/src/benchmark_api_internal.cc
+++ b/src/benchmark_api_internal.cc
@@ -7,7 +7,8 @@
namespace benchmark {
namespace internal {
-BenchmarkInstance::BenchmarkInstance(Benchmark* benchmark, int family_idx,
+BenchmarkInstance::BenchmarkInstance(benchmark::Benchmark* benchmark,
+ int family_idx,
int per_family_instance_idx,
const std::vector<int64_t>& args,
int thread_count)
diff --git a/src/benchmark_api_internal.h b/src/benchmark_api_internal.h
index efa0602..5b48ea2 100644
--- a/src/benchmark_api_internal.h
+++ b/src/benchmark_api_internal.h
@@ -17,7 +17,7 @@
// Information kept per benchmark we may want to run
class BenchmarkInstance {
public:
- BenchmarkInstance(Benchmark* benchmark, int family_idx,
+ BenchmarkInstance(benchmark::Benchmark* benchmark, int family_idx,
int per_family_instance_idx,
const std::vector<int64_t>& args, int thread_count);
@@ -52,7 +52,7 @@
private:
BenchmarkName name_;
- Benchmark& benchmark_;
+ benchmark::Benchmark& benchmark_;
const int family_index_;
const int per_family_instance_index_;
AggregationReportMode aggregation_report_mode_;
diff --git a/src/benchmark_register.cc b/src/benchmark_register.cc
index 8327df0..65e1afc 100644
--- a/src/benchmark_register.cc
+++ b/src/benchmark_register.cc
@@ -75,7 +75,7 @@
static BenchmarkFamilies* GetInstance();
// Registers a benchmark family and returns the index assigned to it.
- size_t AddBenchmark(std::unique_ptr<Benchmark> family);
+ size_t AddBenchmark(std::unique_ptr<benchmark::Benchmark> family);
// Clear all registered benchmark families.
void ClearBenchmarks();
@@ -89,7 +89,7 @@
private:
BenchmarkFamilies() {}
- std::vector<std::unique_ptr<Benchmark>> families_;
+ std::vector<std::unique_ptr<benchmark::Benchmark>> families_;
Mutex mutex_;
};
@@ -98,7 +98,8 @@
return &instance;
}
-size_t BenchmarkFamilies::AddBenchmark(std::unique_ptr<Benchmark> family) {
+size_t BenchmarkFamilies::AddBenchmark(
+ std::unique_ptr<benchmark::Benchmark> family) {
MutexLock l(mutex_);
size_t index = families_.size();
families_.push_back(std::move(family));
@@ -135,7 +136,7 @@
int next_family_index = 0;
MutexLock l(mutex_);
- for (std::unique_ptr<Benchmark>& family : families_) {
+ for (std::unique_ptr<benchmark::Benchmark>& family : families_) {
int family_index = next_family_index;
int per_family_instance_index = 0;
@@ -191,8 +192,9 @@
return true;
}
-Benchmark* RegisterBenchmarkInternal(std::unique_ptr<Benchmark> bench) {
- Benchmark* bench_ptr = bench.get();
+benchmark::Benchmark* RegisterBenchmarkInternal(
+ std::unique_ptr<benchmark::Benchmark> bench) {
+ benchmark::Benchmark* bench_ptr = bench.get();
BenchmarkFamilies* families = BenchmarkFamilies::GetInstance();
families->AddBenchmark(std::move(bench));
return bench_ptr;
@@ -206,13 +208,15 @@
return BenchmarkFamilies::GetInstance()->FindBenchmarks(re, benchmarks, Err);
}
+} // end namespace internal
+
//=============================================================================//
// Benchmark
//=============================================================================//
Benchmark::Benchmark(const std::string& name)
: name_(name),
- aggregation_report_mode_(ARM_Unspecified),
+ aggregation_report_mode_(internal::ARM_Unspecified),
time_unit_(GetDefaultTimeUnit()),
use_default_time_unit_(true),
range_multiplier_(kRangeMultiplier),
@@ -253,7 +257,7 @@
Benchmark* Benchmark::Range(int64_t start, int64_t limit) {
BM_CHECK(ArgsCnt() == -1 || ArgsCnt() == 1);
std::vector<int64_t> arglist;
- AddRange(&arglist, start, limit, range_multiplier_);
+ internal::AddRange(&arglist, start, limit, range_multiplier_);
for (int64_t i : arglist) {
args_.push_back({i});
@@ -266,8 +270,8 @@
BM_CHECK(ArgsCnt() == -1 || ArgsCnt() == static_cast<int>(ranges.size()));
std::vector<std::vector<int64_t>> arglists(ranges.size());
for (std::size_t i = 0; i < ranges.size(); i++) {
- AddRange(&arglists[i], ranges[i].first, ranges[i].second,
- range_multiplier_);
+ internal::AddRange(&arglists[i], ranges[i].first, ranges[i].second,
+ range_multiplier_);
}
ArgsProduct(arglists);
@@ -382,8 +386,8 @@
Benchmark* Benchmark::Iterations(IterationCount n) {
BM_CHECK(n > 0);
- BM_CHECK(IsZero(min_time_));
- BM_CHECK(IsZero(min_warmup_time_));
+ BM_CHECK(internal::IsZero(min_time_));
+ BM_CHECK(internal::IsZero(min_warmup_time_));
iterations_ = n;
return this;
}
@@ -395,21 +399,23 @@
}
Benchmark* Benchmark::ReportAggregatesOnly(bool value) {
- aggregation_report_mode_ = value ? ARM_ReportAggregatesOnly : ARM_Default;
+ aggregation_report_mode_ =
+ value ? internal::ARM_ReportAggregatesOnly : internal::ARM_Default;
return this;
}
Benchmark* Benchmark::DisplayAggregatesOnly(bool value) {
// If we were called, the report mode is no longer 'unspecified', in any case.
+ using internal::AggregationReportMode;
aggregation_report_mode_ = static_cast<AggregationReportMode>(
- aggregation_report_mode_ | ARM_Default);
+ aggregation_report_mode_ | internal::ARM_Default);
if (value) {
aggregation_report_mode_ = static_cast<AggregationReportMode>(
- aggregation_report_mode_ | ARM_DisplayReportAggregatesOnly);
+ aggregation_report_mode_ | internal::ARM_DisplayReportAggregatesOnly);
} else {
aggregation_report_mode_ = static_cast<AggregationReportMode>(
- aggregation_report_mode_ & ~ARM_DisplayReportAggregatesOnly);
+ aggregation_report_mode_ & ~internal::ARM_DisplayReportAggregatesOnly);
}
return this;
@@ -463,7 +469,7 @@
BM_CHECK_GT(min_threads, 0);
BM_CHECK_GE(max_threads, min_threads);
- AddRange(&thread_counts_, min_threads, max_threads, 2);
+ internal::AddRange(&thread_counts_, min_threads, max_threads, 2);
return this;
}
@@ -515,6 +521,8 @@
return use_default_time_unit_ ? GetDefaultTimeUnit() : time_unit_;
}
+namespace internal {
+
//=============================================================================//
// FunctionBenchmark
//=============================================================================//
diff --git a/src/benchmark_runner.cc b/src/benchmark_runner.cc
index d8a2357..fb68867 100644
--- a/src/benchmark_runner.cc
+++ b/src/benchmark_runner.cc
@@ -217,7 +217,8 @@
};
std::unique_ptr<ThreadRunnerBase> GetThreadRunner(
- const threadrunner_factory& userThreadRunnerFactory, int num_threads) {
+ const benchmark::threadrunner_factory& userThreadRunnerFactory,
+ int num_threads) {
return userThreadRunnerFactory
? userThreadRunnerFactory(num_threads)
: std::make_unique<ThreadRunnerDefault>(num_threads);
diff --git a/test/benchmark_setup_teardown_cb_types_gtest.cc b/test/benchmark_setup_teardown_cb_types_gtest.cc
index c5a1a66..2ed255d 100644
--- a/test/benchmark_setup_teardown_cb_types_gtest.cc
+++ b/test/benchmark_setup_teardown_cb_types_gtest.cc
@@ -1,13 +1,13 @@
#include "benchmark/benchmark.h"
#include "gtest/gtest.h"
+using benchmark::Benchmark;
using benchmark::BenchmarkReporter;
using benchmark::callback_function;
using benchmark::ClearRegisteredBenchmarks;
using benchmark::RegisterBenchmark;
using benchmark::RunSpecifiedBenchmarks;
using benchmark::State;
-using benchmark::internal::Benchmark;
static int functor_called = 0;
struct Functor {
diff --git a/test/memory_results_gtest.cc b/test/memory_results_gtest.cc
index c40df8f..70a5a5a 100644
--- a/test/memory_results_gtest.cc
+++ b/test/memory_results_gtest.cc
@@ -5,13 +5,13 @@
namespace {
+using benchmark::Benchmark;
using benchmark::ClearRegisteredBenchmarks;
using benchmark::ConsoleReporter;
using benchmark::MemoryManager;
using benchmark::RegisterBenchmark;
using benchmark::RunSpecifiedBenchmarks;
using benchmark::State;
-using benchmark::internal::Benchmark;
constexpr int N_REPETITIONS = 100;
constexpr int N_ITERATIONS = 1;
diff --git a/test/options_test.cc b/test/options_test.cc
index f9dc59b..70e3e18 100644
--- a/test/options_test.cc
+++ b/test/options_test.cc
@@ -51,7 +51,7 @@
BENCHMARK(BM_basic)->DenseRange(-2, 2, 1);
BENCHMARK(BM_basic)->Ranges({{-64, 1}, {-8, -1}});
-void CustomArgs(benchmark::internal::Benchmark* b) {
+void CustomArgs(benchmark::Benchmark* b) {
for (int i = 0; i < 10; ++i) {
b->Arg(i);
}
diff --git a/test/register_benchmark_test.cc b/test/register_benchmark_test.cc
index e6f24c2..3e39437 100644
--- a/test/register_benchmark_test.cc
+++ b/test/register_benchmark_test.cc
@@ -56,7 +56,7 @@
#define ADD_CASES(...) \
const int CONCAT(dummy, __LINE__) = AddCases({__VA_ARGS__})
-using ReturnVal = benchmark::internal::Benchmark const* const;
+using ReturnVal = benchmark::Benchmark const* const;
//----------------------------------------------------------------------------//
// Test RegisterBenchmark with no additional arguments
diff --git a/test/time_unit_gtest.cc b/test/time_unit_gtest.cc
index 21fd91b..0da1109 100644
--- a/test/time_unit_gtest.cc
+++ b/test/time_unit_gtest.cc
@@ -6,7 +6,7 @@
namespace {
-class DummyBenchmark : public Benchmark {
+class DummyBenchmark : public benchmark::Benchmark {
public:
DummyBenchmark() : Benchmark("dummy") {}
void Run(State& /*state*/) override {}