From 035a0ba2b374ca4343a7e4e6652c6c0d0780e8dd Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Wed, 18 Mar 2015 18:34:30 -0400 Subject: [PATCH 1/4] fix macro names and use __COUNTER__ --- include/benchmark/benchmark_api.h | 45 +++++++++++++++++++------------ 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/include/benchmark/benchmark_api.h b/include/benchmark/benchmark_api.h index 0982e934..c342d1a8 100644 --- a/include/benchmark/benchmark_api.h +++ b/include/benchmark/benchmark_api.h @@ -421,14 +421,28 @@ class Benchmark { // ------------------------------------------------------ // Macro to register benchmarks -// Helpers for generating unique variable names -#define BENCHMARK_CONCAT(a, b, c) BENCHMARK_CONCAT2(a, b, c) -#define BENCHMARK_CONCAT2(a, b, c) a##b##c +// Check that __COUNTER__ is defined and that __COUNTER__ increases by 1 +// every time it is expanded. X + 1 == X + 0 is used in case X is defined to be +// empty. If X is empty the expression becomes (+1 == +0). +#if defined(__COUNTER__) && (__COUNTER__ + 1 == __COUNTER__ + 0) +#define BENCHMARK_PRIVATE_UNIQUE_ID __COUNTER__ +#else +#define BENCHMARK_PRIVATE_UNIQUE_ID __LINE__ +#endif -#define BENCHMARK(n) \ - static ::benchmark::internal::Benchmark* BENCHMARK_CONCAT( \ - _benchmark_, n, __LINE__) BENCHMARK_UNUSED = \ - (new ::benchmark::internal::Benchmark(#n, n)) + +// Helpers for generating unique variable names +#define BENCHMARK_PRIVATE_NAME(n) \ + BENCHMARK_PRIVATE_NAME2(_benchmark_, BENCHMARK_PRIVATE_UNIQUE_ID, n) +#define BENCHMARK_PRIVATE_NAME2(a, b, c) BENCHMARK_PRIVATE_NAME3(a, b, c) +#define BENCHMARK_PRIVATE_NAME3(a, b, c) a##b##c + +#define BENCHMARK_PRIVATE_DECLARE(n) \ + static ::benchmark::internal::Benchmark* \ + BENCHMARK_PRIVATE_NAME(n) BENCHMARK_UNUSED + +#define BENCHMARK(n) \ + BENCHMARK_PRIVATE_DECLARE(n) = (new ::benchmark::internal::Benchmark(#n, n)) // Old-style macros #define BENCHMARK_WITH_ARG(n, a) BENCHMARK(n)->Arg((a)) @@ -445,21 +459,18 @@ class Benchmark { // BENCHMARK_TEMPLATE(BM_Foo, 1); // // will register BM_Foo<1> as a benchmark. -#define BENCHMARK_TEMPLATE1(n, a) \ - static ::benchmark::internal::Benchmark* BENCHMARK_CONCAT( \ - _benchmark_, n, __LINE__) BENCHMARK_UNUSED = \ +#define BENCHMARK_TEMPLATE1(n, a) \ + BENCHMARK_PRIVATE_DECLARE(n) = \ (new ::benchmark::internal::Benchmark(#n "<" #a ">", n)) -#define BENCHMARK_TEMPLATE2(n, a, b) \ - static ::benchmark::internal::Benchmark* BENCHMARK_CONCAT( \ - _benchmark_, n, __LINE__) BENCHMARK_UNUSED = \ +#define BENCHMARK_TEMPLATE2(n, a, b) \ + BENCHMARK_PRIVATE_DECLARE(n) = \ (new ::benchmark::internal::Benchmark(#n "<" #a "," #b ">", n)) #if __cplusplus >= 201103L -#define BENCHMARK_TEMPLATE(n, ...) \ - static ::benchmark::internal::Benchmark* BENCHMARK_CONCAT( \ - _benchmark_, n, __LINE__) BENCHMARK_UNUSED = \ - (new ::benchmark::internal::Benchmark( \ +#define BENCHMARK_TEMPLATE(n, ...) \ + BENCHMARK_PRIVATE_DECLARE(n) = \ + (new ::benchmark::internal::Benchmark( \ #n "<" #__VA_ARGS__ ">", n<__VA_ARGS__>)) #else #define BENCHMARK_TEMPLATE(n, a) BENCHMARK_TEMPLATE1(n, a) From 3bf0b251a37a8dcffd610ec07ac9b8b49a713455 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Wed, 18 Mar 2015 18:35:36 -0400 Subject: [PATCH 2/4] remove whitespace --- include/benchmark/benchmark_api.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/benchmark/benchmark_api.h b/include/benchmark/benchmark_api.h index c342d1a8..9267ea58 100644 --- a/include/benchmark/benchmark_api.h +++ b/include/benchmark/benchmark_api.h @@ -430,7 +430,6 @@ class Benchmark { #define BENCHMARK_PRIVATE_UNIQUE_ID __LINE__ #endif - // Helpers for generating unique variable names #define BENCHMARK_PRIVATE_NAME(n) \ BENCHMARK_PRIVATE_NAME2(_benchmark_, BENCHMARK_PRIVATE_UNIQUE_ID, n) From e96f068a1d903b88837c18462ba2a69df46c347a Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Wed, 18 Mar 2015 19:19:17 -0400 Subject: [PATCH 3/4] rename BENCHMARK_PRIVATE_NAME to BENCHMARK_PRIVATE_CONCAT --- include/benchmark/benchmark_api.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/benchmark/benchmark_api.h b/include/benchmark/benchmark_api.h index 9267ea58..979d32c5 100644 --- a/include/benchmark/benchmark_api.h +++ b/include/benchmark/benchmark_api.h @@ -431,14 +431,14 @@ class Benchmark { #endif // Helpers for generating unique variable names -#define BENCHMARK_PRIVATE_NAME(n) \ - BENCHMARK_PRIVATE_NAME2(_benchmark_, BENCHMARK_PRIVATE_UNIQUE_ID, n) -#define BENCHMARK_PRIVATE_NAME2(a, b, c) BENCHMARK_PRIVATE_NAME3(a, b, c) -#define BENCHMARK_PRIVATE_NAME3(a, b, c) a##b##c +#define BENCHMARK_PRIVATE_CONCAT(n) \ + BENCHMARK_PRIVATE_CONCAT2(_benchmark_, BENCHMARK_PRIVATE_UNIQUE_ID, n) +#define BENCHMARK_PRIVATE_CONCAT2(a, b, c) BENCHMARK_PRIVATE_CONCAT3(a, b, c) +#define BENCHMARK_PRIVATE_CONCAT3(a, b, c) a##b##c #define BENCHMARK_PRIVATE_DECLARE(n) \ static ::benchmark::internal::Benchmark* \ - BENCHMARK_PRIVATE_NAME(n) BENCHMARK_UNUSED + BENCHMARK_PRIVATE_CONCAT(n) BENCHMARK_UNUSED #define BENCHMARK(n) \ BENCHMARK_PRIVATE_DECLARE(n) = (new ::benchmark::internal::Benchmark(#n, n)) From 75712367c115500bf24b13396c36926df1ed1556 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Wed, 18 Mar 2015 22:49:09 -0400 Subject: [PATCH 4/4] update names --- include/benchmark/benchmark_api.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/benchmark/benchmark_api.h b/include/benchmark/benchmark_api.h index 979d32c5..340ef6f8 100644 --- a/include/benchmark/benchmark_api.h +++ b/include/benchmark/benchmark_api.h @@ -431,14 +431,14 @@ class Benchmark { #endif // Helpers for generating unique variable names -#define BENCHMARK_PRIVATE_CONCAT(n) \ - BENCHMARK_PRIVATE_CONCAT2(_benchmark_, BENCHMARK_PRIVATE_UNIQUE_ID, n) -#define BENCHMARK_PRIVATE_CONCAT2(a, b, c) BENCHMARK_PRIVATE_CONCAT3(a, b, c) -#define BENCHMARK_PRIVATE_CONCAT3(a, b, c) a##b##c +#define BENCHMARK_PRIVATE_NAME(n) \ + BENCHMARK_PRIVATE_CONCAT(_benchmark_, BENCHMARK_PRIVATE_UNIQUE_ID, n) +#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_DECLARE(n) \ static ::benchmark::internal::Benchmark* \ - BENCHMARK_PRIVATE_CONCAT(n) BENCHMARK_UNUSED + BENCHMARK_PRIVATE_NAME(n) BENCHMARK_UNUSED #define BENCHMARK(n) \ BENCHMARK_PRIVATE_DECLARE(n) = (new ::benchmark::internal::Benchmark(#n, n))