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