vmkdrivers/BLD/build/HEADERS/vmkapi-current-all-public/vmkernel64/release/lib/vmkapi_util.h
2015-10-23 18:26:03 -04:00

191 lines
6.7 KiB
C

/* **********************************************************
* Copyright 2008 - 2009, 2013 VMware, Inc. All rights reserved.
* **********************************************************/
/*
* @VMKAPIMOD_LICENSE@
*/
/*
***********************************************************************
* Utilities */ /**
*
* \addtogroup Lib
* @{
* \defgroup Util Utilities
*
* @{
***********************************************************************
*/
#ifndef _VMKAPI_UTIL_H_
#define _VMKAPI_UTIL_H_
/** \cond never */
#ifndef VMK_HEADER_INCLUDED_FROM_VMKAPI_H
#error This vmkapi file should never be included directly but only via vmkapi.h
#endif
/** \endcond never */
/*
***********************************************************************
* VMK_STRINGIFY -- */ /**
*
* \brief Turn a preprocessor variable into a string
*
* \param[in] v A preprocessor variable to be converted to a
* string.
*
***********************************************************************
*/
/** \cond never */
#define __VMK_STRINGIFY(v) #v
/** \endcond never */
#define VMK_STRINGIFY(v) __VMK_STRINGIFY(v)
/*
***********************************************************************
* VMK_UTIL_ROUNDUP -- */ /**
*
* \brief Round up a value X to the next multiple of Y.
*
* \param[in] x Value to round up.
* \param[in] y Value to round up to the next multiple of.
*
* \returns Rounded up value.
*
***********************************************************************
*/
#define VMK_UTIL_ROUNDUP(x, y) ((((x)+(y)-1) / (y)) * (y))
/**
* \brief A series of macros used to count parameters in a varargs list
*/
/*
***********************************************************************
* __VMK_UTIL_MASK_ARGS_INT__ -- */ /**
*
* \brief Internal macro to ignore the first 128 varargs parameters and
* evaluate as 129th.
*
* This is used as part of VMK_UTIL_NUM_ARGS(). VMKAPI clients should
* not call this macro directly.
*
***********************************************************************
*/
/** \cond nodoc */
#define __VMK_UTIL_MASK_ARGS_INT__( \
_ARG1, _ARG2, _ARG3, _ARG4, _ARG5, \
_ARG6, _ARG7, _ARG8, _ARG9, _ARG10, \
_ARG11, _ARG12, _ARG13, _ARG14, _ARG15, \
_ARG16, _ARG17, _ARG18, _ARG19, _ARG20, \
_ARG21, _ARG22, _ARG23, _ARG24, _ARG25, \
_ARG26, _ARG27, _ARG28, _ARG29, _ARG30, \
_ARG31, _ARG32, _ARG33, _ARG34, _ARG35, \
_ARG36, _ARG37, _ARG38, _ARG39, _ARG40, \
_ARG41, _ARG42, _ARG43, _ARG44, _ARG45, \
_ARG46, _ARG47, _ARG48, _ARG49, _ARG50, \
_ARG51, _ARG52, _ARG53, _ARG54, _ARG55, \
_ARG56, _ARG57, _ARG58, _ARG59, _ARG60, \
_ARG61, _ARG62, _ARG63, _ARG64, _ARG65, \
_ARG66, _ARG67, _ARG68, _ARG69, _ARG70, \
_ARG71, _ARG72, _ARG73, _ARG74, _ARG75, \
_ARG76, _ARG77, _ARG78, _ARG79, _ARG80, \
_ARG81, _ARG82, _ARG83, _ARG84, _ARG85, \
_ARG86, _ARG87, _ARG88, _ARG89, _ARG90, \
_ARG91, _ARG92, _ARG93, _ARG94, _ARG95, \
_ARG96, _ARG97, _ARG98, _ARG99, _ARG100, \
_ARG101, _ARG102, _ARG103, _ARG104, _ARG105, \
_ARG106, _ARG107, _ARG108, _ARG109, _ARG110, \
_ARG111, _ARG112, _ARG113, _ARG114, _ARG115, \
_ARG116, _ARG117, _ARG118, _ARG119, _ARG120, \
_ARG121, _ARG122, _ARG123, _ARG124, _ARG125, \
_ARG126, _ARG127, _ARG128, _ARG129, ...) _ARG129
/** \endcond */
/*
***********************************************************************
* __VMK_UTIL_ARG_COUNTS__ -- */ /**
*
* \brief A series of argument counts, used with VMK_UTIL_NUM_ARGS.
*
* This is used as part of VMK_UTIL_NUM_ARGS(). VMKAPI clients should
* no call this macro directly.
*
***********************************************************************
*/
/** \cond nodoc */
#define __VMK_UTIL_ARG_COUNTS__() \
128, 127, 126, 125, 124, 123, 122, 121, 120, \
119, 118, 117, 116, 115, 114, 113, 112, 111, 110, \
109, 108, 107, 106, 105, 104, 103, 102, 101, 100, \
99, 98, 97, 96, 95, 94, 93, 92, 91, 90, \
89, 88, 87, 86, 85, 84, 83, 82, 81, 80, \
79, 78, 77, 76, 75, 74, 73, 72, 71, 70, \
69, 68, 67, 66, 65, 64, 63, 62, 61, 60, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
9, 8, 7, 6, 5, 4, 3, 2, 1, 0
/** \endcond */
/*
***********************************************************************
* __VMK_UTIL_MASK_ARGS__ -- */ /**
*
* \brief Variadic macro that masks the first 128 arguments, evaluating
* the 129th.
*
* This is used as part of VMK_UTIL_NUM_ARGS(). VMKAPI clients should
* no call this macro directly.
*
***********************************************************************
*/
/** \cond nodoc */
#define __VMK_UTIL_MASK_ARGS__(...) \
__VMK_UTIL_MASK_ARGS_INT__(__VA_ARGS__)
/** \endcond */
/*
***********************************************************************
* VMK_UTIL_NUM_ARGS -- */ /**
*
* \brief Macro to count the number of varargs parameters.
*
* \param[in] ... varargs parameters. There can be 0 to 127
* parameters. More than 127 produces an
* undefined result.
*
* \note This works by creating a larger varargs series of parameters
* around the passed series and using internal macros. The
* larger series is a dummy parameter (to support if the passed
* series has no parameters), the passed series, and then a
* decreasing series of numbers representing the parameter count.
* The internal macros effectively ignore the first 128
* parameters of this larger series and evaluates as the 129th,
* thus effectively evaluating as one plus the count of passed
* parameters. (The one is offset by subtraction in this
* macro).
* \note This macro relies on the special behavior of ##__VA_ARGS__,
* as described here:
* http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html
* In the case that the passed varargs series has no elements,
* ##__VA_ARGS__ will also consume the comma preceding it,
* allowing this macro (VMK_UTIL_NUM_ARGS) to compile correctly
* and evaluate as 0.
*
***********************************************************************
*/
/** \cond nodoc */
#define VMK_UTIL_NUM_ARGS(...) \
(__VMK_UTIL_MASK_ARGS__(_DUMMY, ##__VA_ARGS__, __VMK_UTIL_ARG_COUNTS__()) - 1)
/** \endcond */
#endif /* _VMKAPI_UTIL_H_ */
/** @} */
/** @} */