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