cb66c5d68e
bazel / bazel.ubuntu-latest (push) Failing after 1s
build-and-test-perfcounters / ubuntu-latest.Debug (push) Failing after 0s
build-and-test-perfcounters / ubuntu-latest.Release (push) Failing after 1s
doxygen / Build HTML documentation (push) Failing after 1s
python + Bazel pre-commit checks / pre-commit (push) Failing after 1s
sanitizer / tsan.Debug (push) Failing after 1s
sanitizer / ubsan.Debug (push) Failing after 0s
sanitizer / ubsan.RelWithDebInfo (push) Failing after 1s
build-and-test-min-cmake / ubuntu-latest.min-cmake (push) Failing after 1s
clang-format-lint / check-clang-format (push) Failing after 1s
sanitizer / asan.Debug (push) Failing after 1s
sanitizer / msan.RelWithDebInfo (push) Failing after 1s
clang-tidy / run-clang-tidy (push) Failing after 1s
sanitizer / msan.Debug (push) Failing after 1s
sanitizer / asan.RelWithDebInfo (push) Failing after 0s
sanitizer / tsan.RelWithDebInfo (push) Failing after 0s
test-bindings / Test Rust bindings on ubuntu-latest (push) Failing after 0s
test-bindings / Test Python 3.10 bindings on ubuntu-latest (push) Failing after 0s
test-bindings / Test Python 3.11 bindings on ubuntu-latest (push) Failing after 0s
test-bindings / Test Python 3.12 bindings on ubuntu-latest (push) Failing after 1s
test-bindings / Test Python 3.13 bindings on ubuntu-latest (push) Failing after 0s
build-and-test / macos-latest.Debug.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.shared.clang++ (push) Has been cancelled
bazel / bazel.macos-latest (push) Has been cancelled
bazel / bazel.windows-latest (push) Has been cancelled
build-and-test-min-cmake / macos-latest.min-cmake (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Debug.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.shared.g++ (push) Has been cancelled
build-and-test / macos-latest.Debug.static.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Debug.static.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.static.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.static.g++ (push) Has been cancelled
build-and-test / macos-latest.Release.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.shared.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.shared.clang++ (push) Has been cancelled
build-and-test / macos-latest.Release.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Debug.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Debug.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Debug.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Release.static.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.static.g++ (push) Has been cancelled
build-and-test / windows-2025.Debug.static.VS-18-2025 (push) Has been cancelled
build-and-test / windows-2022.Release.shared.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2022.Release.static.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2025.Release.shared.VS-18-2025 (push) Has been cancelled
build-and-test / windows-2025.Release.static.VS-18-2025 (push) Has been cancelled
build-and-test / windows-latest.Debug.shared.CLANG64 (push) Has been cancelled
build-and-test / windows-latest.Debug.shared.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Debug.shared.UCRT64 (push) Has been cancelled
build-and-test / windows-latest.Debug.static.CLANG64 (push) Has been cancelled
build-and-test / windows-latest.Debug.static.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Debug.static.UCRT64 (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.static.clang++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.static.clang++ (push) Has been cancelled
build-and-test / macos-latest.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-22.04.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.shared.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04.Release.static.g++ (push) Has been cancelled
build-and-test / ubuntu-24.04-arm.Release.static.g++ (push) Has been cancelled
build-and-test / windows-2022.Debug.shared.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2022.Debug.static.VS-17-2022 (push) Has been cancelled
build-and-test / windows-2025.Debug.shared.VS-18-2025 (push) Has been cancelled
build-and-test / windows-latest.Release.static.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Release.static.UCRT64 (push) Has been cancelled
test-bindings / Test Python 3.10 bindings on macos-latest (push) Has been cancelled
test-bindings / Test Python 3.11 bindings on macos-latest (push) Has been cancelled
test-bindings / Test Python 3.12 bindings on macos-latest (push) Has been cancelled
test-bindings / Test Python 3.13 bindings on macos-latest (push) Has been cancelled
build-and-test / windows-latest.Release.shared.CLANG64 (push) Has been cancelled
build-and-test / windows-latest.Release.shared.MINGW64 (push) Has been cancelled
build-and-test / windows-latest.Release.shared.UCRT64 (push) Has been cancelled
build-and-test / windows-latest.Release.static.CLANG64 (push) Has been cancelled
test-bindings / Test Python 3.12 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Python 3.13 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Python 3.10 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Python 3.11 bindings on windows-latest (push) Has been cancelled
test-bindings / Test Rust bindings on macos-latest (push) Has been cancelled
test-bindings / Test Rust bindings on windows-latest (push) Has been cancelled
259 lines
13 KiB
C++
259 lines
13 KiB
C++
// Copyright 2015 Google Inc. All rights reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef BENCHMARK_REGISTRATION_H_
|
|
#define BENCHMARK_REGISTRATION_H_
|
|
|
|
#include "benchmark/benchmark_api.h"
|
|
#include "benchmark/macros.h"
|
|
|
|
#if defined(__clang__)
|
|
#define BENCHMARK_DISABLE_COUNTER_WARNING \
|
|
_Pragma("GCC diagnostic push") \
|
|
_Pragma("GCC diagnostic ignored \"-Wunknown-warning-option\"") \
|
|
_Pragma("GCC diagnostic ignored \"-Wc2y-extensions\"")
|
|
#define BENCHMARK_RESTORE_COUNTER_WARNING _Pragma("GCC diagnostic pop")
|
|
#else
|
|
#define BENCHMARK_DISABLE_COUNTER_WARNING
|
|
#define BENCHMARK_RESTORE_COUNTER_WARNING
|
|
#endif
|
|
|
|
BENCHMARK_DISABLE_COUNTER_WARNING
|
|
#if defined(__COUNTER__) && (__COUNTER__ + 1 == __COUNTER__ + 0)
|
|
#define BENCHMARK_PRIVATE_UNIQUE_ID __COUNTER__
|
|
#else
|
|
#define BENCHMARK_PRIVATE_UNIQUE_ID __LINE__
|
|
#endif
|
|
BENCHMARK_RESTORE_COUNTER_WARNING
|
|
|
|
#define BENCHMARK_PRIVATE_NAME(...) \
|
|
BENCHMARK_PRIVATE_CONCAT(benchmark_uniq_, BENCHMARK_PRIVATE_UNIQUE_ID, \
|
|
__VA_ARGS__)
|
|
|
|
#define BENCHMARK_PRIVATE_CONCAT(a, b, c) BENCHMARK_PRIVATE_CONCAT2(a, b, c)
|
|
#define BENCHMARK_PRIVATE_CONCAT2(a, b, c) a##b##c
|
|
#define BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method) \
|
|
BaseClass##_##Method##_Benchmark
|
|
|
|
#define BENCHMARK_PRIVATE_DECLARE(n) \
|
|
BENCHMARK_DISABLE_COUNTER_WARNING \
|
|
static ::benchmark::Benchmark const* const BENCHMARK_PRIVATE_NAME(n) \
|
|
BENCHMARK_RESTORE_COUNTER_WARNING BENCHMARK_UNUSED
|
|
|
|
#define BENCHMARK(...) \
|
|
BENCHMARK_PRIVATE_DECLARE(_benchmark_) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique< \
|
|
::benchmark::internal::FunctionBenchmark>( \
|
|
#__VA_ARGS__, \
|
|
static_cast<::benchmark::internal::Function*>(__VA_ARGS__))))
|
|
|
|
#define BENCHMARK_WITH_ARG(n, a) BENCHMARK(n)->Arg((a))
|
|
#define BENCHMARK_WITH_ARG2(n, a1, a2) BENCHMARK(n)->Args({(a1), (a2)})
|
|
#define BENCHMARK_WITH_UNIT(n, t) BENCHMARK(n)->Unit((t))
|
|
#define BENCHMARK_RANGE(n, lo, hi) BENCHMARK(n)->Range((lo), (hi))
|
|
#define BENCHMARK_RANGE2(n, l1, h1, l2, h2) \
|
|
BENCHMARK(n)->RangePair({{(l1), (h1)}, {(l2), (h2)}})
|
|
|
|
#define BENCHMARK_CAPTURE(func, test_case_name, ...) \
|
|
BENCHMARK_PRIVATE_DECLARE(_benchmark_) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique< \
|
|
::benchmark::internal::FunctionBenchmark>( \
|
|
#func "/" #test_case_name, \
|
|
[](::benchmark::State& st) { func(st, __VA_ARGS__); })))
|
|
|
|
#define BENCHMARK_NAMED(func, test_case_name) \
|
|
BENCHMARK_PRIVATE_DECLARE(_benchmark_) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique< \
|
|
::benchmark::internal::FunctionBenchmark>( \
|
|
#func "/" #test_case_name, \
|
|
static_cast<::benchmark::internal::Function*>(func))))
|
|
|
|
#define BENCHMARK_TEMPLATE1(n, a) \
|
|
BENCHMARK_PRIVATE_DECLARE(n) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique< \
|
|
::benchmark::internal::FunctionBenchmark>( \
|
|
#n "<" #a ">", \
|
|
static_cast<::benchmark::internal::Function*>(n<a>))))
|
|
|
|
#define BENCHMARK_TEMPLATE2(n, a, b) \
|
|
BENCHMARK_PRIVATE_DECLARE(n) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique< \
|
|
::benchmark::internal::FunctionBenchmark>( \
|
|
#n "<" #a "," #b ">", \
|
|
static_cast<::benchmark::internal::Function*>(n<a, b>))))
|
|
|
|
#define BENCHMARK_TEMPLATE(n, ...) \
|
|
BENCHMARK_PRIVATE_DECLARE(n) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique< \
|
|
::benchmark::internal::FunctionBenchmark>( \
|
|
#n "<" #__VA_ARGS__ ">", \
|
|
static_cast<::benchmark::internal::Function*>(n<__VA_ARGS__>))))
|
|
|
|
#define BENCHMARK_TEMPLATE1_CAPTURE(func, a, test_case_name, ...) \
|
|
BENCHMARK_CAPTURE(func<a>, test_case_name, __VA_ARGS__)
|
|
|
|
#define BENCHMARK_TEMPLATE2_CAPTURE(func, a, b, test_case_name, ...) \
|
|
BENCHMARK_PRIVATE_DECLARE(func) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique< \
|
|
::benchmark::internal::FunctionBenchmark>( \
|
|
#func "<" #a "," #b ">" \
|
|
"/" #test_case_name, \
|
|
[](::benchmark::State& st) { func<a, b>(st, __VA_ARGS__); })))
|
|
|
|
#define BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
|
class BaseClass##_##Method##_Benchmark : public BaseClass { \
|
|
public: \
|
|
BaseClass##_##Method##_Benchmark() { \
|
|
this->SetName(#BaseClass "/" #Method); \
|
|
} \
|
|
\
|
|
protected: \
|
|
void BenchmarkCase(::benchmark::State&) override; \
|
|
};
|
|
|
|
#define BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
|
|
class BaseClass##_##Method##_Benchmark : public BaseClass<a> { \
|
|
public: \
|
|
BaseClass##_##Method##_Benchmark() { \
|
|
this->SetName(#BaseClass "<" #a ">/" #Method); \
|
|
} \
|
|
\
|
|
protected: \
|
|
void BenchmarkCase(::benchmark::State&) override; \
|
|
};
|
|
|
|
#define BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
|
class BaseClass##_##Method##_Benchmark : public BaseClass<a, b> { \
|
|
public: \
|
|
BaseClass##_##Method##_Benchmark() { \
|
|
this->SetName(#BaseClass "<" #a "," #b ">/" #Method); \
|
|
} \
|
|
\
|
|
protected: \
|
|
void BenchmarkCase(::benchmark::State&) override; \
|
|
};
|
|
|
|
#define BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, ...) \
|
|
class BaseClass##_##Method##_Benchmark : public BaseClass<__VA_ARGS__> { \
|
|
public: \
|
|
BaseClass##_##Method##_Benchmark() { \
|
|
this->SetName(#BaseClass "<" #__VA_ARGS__ ">/" #Method); \
|
|
} \
|
|
\
|
|
protected: \
|
|
void BenchmarkCase(::benchmark::State&) override; \
|
|
};
|
|
|
|
#define BENCHMARK_DEFINE_F(BaseClass, Method) \
|
|
BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_TEMPLATE1_DEFINE_F(BaseClass, Method, a) \
|
|
BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_TEMPLATE2_DEFINE_F(BaseClass, Method, a, b) \
|
|
BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_TEMPLATE_DEFINE_F(BaseClass, Method, ...) \
|
|
BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_REGISTER_F(BaseClass, Method) \
|
|
BENCHMARK_PRIVATE_REGISTER_F(BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method))
|
|
|
|
#define BENCHMARK_PRIVATE_REGISTER_F(TestName) \
|
|
BENCHMARK_PRIVATE_DECLARE(TestName) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique<TestName>()))
|
|
|
|
#define BENCHMARK_TEMPLATE_PRIVATE_CONCAT_NAME_F(BaseClass, Method) \
|
|
BaseClass##_##Method##_BenchmarkTemplate
|
|
|
|
#define BENCHMARK_TEMPLATE_METHOD_F(BaseClass, Method) \
|
|
template <class... Args> \
|
|
class BENCHMARK_TEMPLATE_PRIVATE_CONCAT_NAME_F(BaseClass, Method) \
|
|
: public BaseClass<Args...> { \
|
|
protected: \
|
|
using Base = BaseClass<Args...>; \
|
|
void BenchmarkCase(::benchmark::State&) override; \
|
|
}; \
|
|
template <class... Args> \
|
|
void BENCHMARK_TEMPLATE_PRIVATE_CONCAT_NAME_F( \
|
|
BaseClass, Method)<Args...>::BenchmarkCase
|
|
|
|
#define BENCHMARK_TEMPLATE_PRIVATE_INSTANTIATE_F(BaseClass, Method, \
|
|
UniqueName, ...) \
|
|
class UniqueName : public BENCHMARK_TEMPLATE_PRIVATE_CONCAT_NAME_F( \
|
|
BaseClass, Method)<__VA_ARGS__> { \
|
|
public: \
|
|
UniqueName() { this->SetName(#BaseClass "<" #__VA_ARGS__ ">/" #Method); } \
|
|
}; \
|
|
BENCHMARK_PRIVATE_DECLARE(BaseClass##_##Method##_Benchmark) = \
|
|
(::benchmark::internal::RegisterBenchmarkInternal( \
|
|
::benchmark::internal::make_unique<UniqueName>()))
|
|
|
|
#define BENCHMARK_TEMPLATE_INSTANTIATE_F(BaseClass, Method, ...) \
|
|
BENCHMARK_DISABLE_COUNTER_WARNING \
|
|
BENCHMARK_TEMPLATE_PRIVATE_INSTANTIATE_F( \
|
|
BaseClass, Method, BENCHMARK_PRIVATE_NAME(BaseClass##Method), \
|
|
__VA_ARGS__) \
|
|
BENCHMARK_RESTORE_COUNTER_WARNING
|
|
|
|
#define BENCHMARK_F(BaseClass, Method) \
|
|
BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
|
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_TEMPLATE1_F(BaseClass, Method, a) \
|
|
BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
|
|
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_TEMPLATE2_F(BaseClass, Method, a, b) \
|
|
BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
|
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_TEMPLATE_F(BaseClass, Method, ...) \
|
|
BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
|
|
void BENCHMARK_PRIVATE_CONCAT_NAME(BaseClass, Method)::BenchmarkCase
|
|
|
|
#define BENCHMARK_MAIN() \
|
|
int main(int argc, char** argv) { \
|
|
benchmark::MaybeReenterWithoutASLR(argc, argv); \
|
|
char arg0_default[] = "benchmark"; \
|
|
char* args_default = reinterpret_cast<char*>(arg0_default); \
|
|
if (!argv) { \
|
|
argc = 1; \
|
|
argv = &args_default; \
|
|
} \
|
|
::benchmark::Initialize(&argc, argv); \
|
|
if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1; \
|
|
::benchmark::RunSpecifiedBenchmarks(); \
|
|
::benchmark::Shutdown(); \
|
|
return 0; \
|
|
} \
|
|
int main(int, char**)
|
|
|
|
#endif // BENCHMARK_REGISTRATION_H_
|