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