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