| #ifndef BENCHMARK_ARRAYSIZE_H_ | 
 | #define BENCHMARK_ARRAYSIZE_H_ | 
 |  | 
 | #include "internal_macros.h" | 
 |  | 
 | namespace benchmark { | 
 | namespace internal { | 
 | // The arraysize(arr) macro returns the # of elements in an array arr. | 
 | // The expression is a compile-time constant, and therefore can be | 
 | // used in defining new arrays, for example.  If you use arraysize on | 
 | // a pointer by mistake, you will get a compile-time error. | 
 | // | 
 |  | 
 | // This template function declaration is used in defining arraysize. | 
 | // Note that the function doesn't need an implementation, as we only | 
 | // use its type. | 
 | template <typename T, size_t N> | 
 | char (&ArraySizeHelper(T (&array)[N]))[N]; | 
 |  | 
 | // That gcc wants both of these prototypes seems mysterious. VC, for | 
 | // its part, can't decide which to use (another mystery). Matching of | 
 | // template overloads: the final frontier. | 
 | #ifndef COMPILER_MSVC | 
 | template <typename T, size_t N> | 
 | char (&ArraySizeHelper(const T (&array)[N]))[N]; | 
 | #endif | 
 |  | 
 | #define arraysize(array) (sizeof(::benchmark::internal::ArraySizeHelper(array))) | 
 |  | 
 | }  // end namespace internal | 
 | }  // end namespace benchmark | 
 |  | 
 | #endif  // BENCHMARK_ARRAYSIZE_H_ |