65 lines
1.2 KiB
C++
65 lines
1.2 KiB
C++
////
|
|
// Macro for dimension of static arrays.
|
|
#if !defined(FUSION_INC_NUMBEROF_H_INCLUDED_)
|
|
#define FUSION_INC_NUMBEROF_H_INCLUDED_
|
|
|
|
#pragma once
|
|
|
|
#if defined(NUMBER_OF)
|
|
#undef NUMBER_OF
|
|
#endif
|
|
|
|
#if FUSION_USE_CHECKED_NUMBER_OF
|
|
|
|
//
|
|
// Note!
|
|
//
|
|
// Use of this "checked" number of macro causes CRT initializers to have to run
|
|
// for static/constant arrays.
|
|
//
|
|
// We cannot enable this for fusion right now, but turning it on and running at
|
|
// least will lead to the compiler errors
|
|
//
|
|
|
|
|
|
// Static arrays will match this signature.
|
|
template< typename T
|
|
>
|
|
inline
|
|
SIZE_T
|
|
NUMBER_OF_validate
|
|
( void const *
|
|
, T
|
|
)
|
|
throw()
|
|
{
|
|
return (0);
|
|
}
|
|
|
|
// Other things (e.g. pointers) will match this signature.
|
|
template< typename T
|
|
>
|
|
inline
|
|
void
|
|
NUMBER_OF_validate
|
|
( T * const
|
|
, T * const *
|
|
)
|
|
throw()
|
|
{
|
|
}
|
|
|
|
// Use the size of the validation function's return type to create an
|
|
// error when this macro is misused.
|
|
#define NUMBER_OF(array) \
|
|
(sizeof(NUMBER_OF_validate((array), &(array))), \
|
|
(sizeof((array)) / sizeof((array)[0])))
|
|
|
|
#else
|
|
|
|
#define NUMBER_OF(x) (sizeof(x) / sizeof((x)[0]))
|
|
|
|
#endif // FUSION_USE_CHECKED_NUMBER_OF
|
|
|
|
#endif // !defined(FUSION_INC_NUMBEROF_H_INCLUDED_)
|