1#ifndef BENCHMARK_ARRAYSIZE_H_ 2#define BENCHMARK_ARRAYSIZE_H_ 3 4#include "internal_macros.h" 5 6namespace benchmark { 7namespace internal { 8// The arraysize(arr) macro returns the # of elements in an array arr. 9// The expression is a compile-time constant, and therefore can be 10// used in defining new arrays, for example. If you use arraysize on 11// a pointer by mistake, you will get a compile-time error. 12// 13 14// This template function declaration is used in defining arraysize. 15// Note that the function doesn't need an implementation, as we only 16// use its type. 17template <typename T, size_t N> 18char (&ArraySizeHelper(T (&array)[N]))[N]; 19 20// That gcc wants both of these prototypes seems mysterious. VC, for 21// its part, can't decide which to use (another mystery). Matching of 22// template overloads: the final frontier. 23#ifndef COMPILER_MSVC 24template <typename T, size_t N> 25char (&ArraySizeHelper(const T (&array)[N]))[N]; 26#endif 27 28#define arraysize(array) (sizeof(::benchmark::internal::ArraySizeHelper(array))) 29 30} // end namespace internal 31} // end namespace benchmark 32 33#endif // BENCHMARK_ARRAYSIZE_H_ 34