You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
6.1 KiB
170 lines
6.1 KiB
2 years ago
|
/*!
|
||
|
\file gk_macros.h
|
||
|
\brief This file contains various macros
|
||
|
|
||
|
\date Started 3/27/2007
|
||
|
\author George
|
||
|
\version\verbatim $Id: gk_macros.h 15048 2013-08-31 19:38:14Z karypis $ \endverbatim
|
||
|
*/
|
||
|
|
||
|
#ifndef _GK_MACROS_H_
|
||
|
#define _GK_MACROS_H_
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* Usefull commands
|
||
|
*-------------------------------------------------------------*/
|
||
|
#define gk_max(a, b) ((a) >= (b) ? (a) : (b))
|
||
|
#define gk_min(a, b) ((a) >= (b) ? (b) : (a))
|
||
|
#define gk_max3(a, b, c) ((a) >= (b) && (a) >= (c) ? (a) : ((b) >= (a) && (b) >= (c) ? (b) : (c)))
|
||
|
#define gk_SWAP(a, b, tmp) do {(tmp) = (a); (a) = (b); (b) = (tmp);} while(0)
|
||
|
#define INC_DEC(a, b, val) do {(a) += (val); (b) -= (val);} while(0)
|
||
|
#define sign(a, b) ((a >= 0 ? b : -b))
|
||
|
|
||
|
#define ONEOVERRANDMAX (1.0/(RAND_MAX+1.0))
|
||
|
#define RandomInRange(u) ((int) (ONEOVERRANDMAX*(u)*rand()))
|
||
|
#define RandomInRange_r(s, u) ((int) (ONEOVERRANDMAX*(u)*rand_r(s)))
|
||
|
|
||
|
#define gk_abs(x) ((x) >= 0 ? (x) : -(x))
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* Timing macros
|
||
|
*-------------------------------------------------------------*/
|
||
|
#define gk_clearcputimer(tmr) (tmr = 0.0)
|
||
|
#define gk_startcputimer(tmr) (tmr -= gk_CPUSeconds())
|
||
|
#define gk_stopcputimer(tmr) (tmr += gk_CPUSeconds())
|
||
|
#define gk_getcputimer(tmr) (tmr)
|
||
|
|
||
|
#define gk_clearwctimer(tmr) (tmr = 0.0)
|
||
|
#define gk_startwctimer(tmr) (tmr -= gk_WClockSeconds())
|
||
|
#define gk_stopwctimer(tmr) (tmr += gk_WClockSeconds())
|
||
|
#define gk_getwctimer(tmr) (tmr)
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* dbglvl handling macros
|
||
|
*-------------------------------------------------------------*/
|
||
|
#define IFSET(a, flag, cmd) if ((a)&(flag)) (cmd);
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* gracefull library exit macro
|
||
|
*-------------------------------------------------------------*/
|
||
|
#define GKSETJMP() (setjmp(gk_return_to_entry))
|
||
|
#define gk_sigcatch() (setjmp(gk_jbufs[gk_cur_jbufs]))
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* Debuging memory leaks
|
||
|
*-------------------------------------------------------------*/
|
||
|
#ifdef DMALLOC
|
||
|
# define MALLOC_CHECK(ptr) \
|
||
|
if (malloc_verify((ptr)) == DMALLOC_VERIFY_ERROR) { \
|
||
|
printf("***MALLOC_CHECK failed on line %d of file %s: " #ptr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
abort(); \
|
||
|
}
|
||
|
#else
|
||
|
# define MALLOC_CHECK(ptr) ;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* CSR conversion macros
|
||
|
*-------------------------------------------------------------*/
|
||
|
#define MAKECSR(i, n, a) \
|
||
|
do { \
|
||
|
for (i=1; i<n; i++) a[i] += a[i-1]; \
|
||
|
for (i=n; i>0; i--) a[i] = a[i-1]; \
|
||
|
a[0] = 0; \
|
||
|
} while(0)
|
||
|
|
||
|
#define SHIFTCSR(i, n, a) \
|
||
|
do { \
|
||
|
for (i=n; i>0; i--) a[i] = a[i-1]; \
|
||
|
a[0] = 0; \
|
||
|
} while(0)
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* ASSERTS that cannot be turned off!
|
||
|
*-------------------------------------------------------------*/
|
||
|
#define GKASSERT(expr) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
abort(); \
|
||
|
}
|
||
|
|
||
|
#define GKASSERTP(expr,msg) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
printf msg ; \
|
||
|
printf("\n"); \
|
||
|
abort(); \
|
||
|
}
|
||
|
|
||
|
#define GKCUASSERT(expr) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
}
|
||
|
|
||
|
#define GKWARN(expr) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
}
|
||
|
|
||
|
#define GKCUASSERTP(expr,msg) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
printf msg ; \
|
||
|
printf("\n"); \
|
||
|
}
|
||
|
|
||
|
#define GKWARNP(expr,msg) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
printf msg ; \
|
||
|
printf("\n"); \
|
||
|
}
|
||
|
|
||
|
|
||
|
/*-------------------------------------------------------------
|
||
|
* Program Assertions
|
||
|
*-------------------------------------------------------------*/
|
||
|
#ifndef NDEBUG
|
||
|
# define ASSERT(expr) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
assert(expr); \
|
||
|
}
|
||
|
|
||
|
# define ASSERTP(expr,msg) \
|
||
|
if (!(expr)) { \
|
||
|
printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
|
||
|
__LINE__, __FILE__); \
|
||
|
printf msg ; \
|
||
|
printf("\n"); \
|
||
|
assert(expr); \
|
||
|
}
|
||
|
#else
|
||
|
# define ASSERT(expr) ;
|
||
|
# define ASSERTP(expr,msg) ;
|
||
|
#endif
|
||
|
|
||
|
#ifndef NDEBUG2
|
||
|
# define ASSERT2 ASSERT
|
||
|
# define ASSERTP2 ASSERTP
|
||
|
#else
|
||
|
# define ASSERT2(expr) ;
|
||
|
# define ASSERTP2(expr,msg) ;
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#endif
|