xref: /llvm-project/third-party/benchmark/src/arraysize.h (revision 5dda2efde574d3a200d04c371f561a77ee9f4aff)
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