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_)
|