1 /*! 2 \file gk_macros.h 3 \brief This file contains various macros 4 5 \date Started 3/27/2007 6 \author George 7 \version\verbatim $Id: gk_macros.h 10711 2011-08-31 22:23:04Z karypis $ \endverbatim 8 */ 9 10 #ifndef _GK_MACROS_H_ 11 #define _GK_MACROS_H_ 12 13 /*------------------------------------------------------------- 14 * Usefull commands 15 *-------------------------------------------------------------*/ 16 #define gk_max(a, b) ((a) >= (b) ? (a) : (b)) 17 #define gk_min(a, b) ((a) >= (b) ? (b) : (a)) 18 #define gk_max3(a, b, c) ((a) >= (b) && (a) >= (c) ? (a) : ((b) >= (a) && (b) >= (c) ? (b) : (c))) 19 #define gk_SWAP(a, b, tmp) do {(tmp) = (a); (a) = (b); (b) = (tmp);} while(0) 20 #define INC_DEC(a, b, val) do {(a) += (val); (b) -= (val);} while(0) 21 #define sign(a, b) ((a >= 0 ? b : -b)) 22 23 #define ONEOVERRANDMAX (1.0/(RAND_MAX+1.0)) 24 #define RandomInRange(u) ((int) (ONEOVERRANDMAX*(u)*rand())) 25 26 #define gk_abs(x) ((x) >= 0 ? (x) : -(x)) 27 28 29 /*------------------------------------------------------------- 30 * Timing macros 31 *-------------------------------------------------------------*/ 32 #define gk_clearcputimer(tmr) (tmr = 0.0) 33 #define gk_startcputimer(tmr) (tmr -= gk_CPUSeconds()) 34 #define gk_stopcputimer(tmr) (tmr += gk_CPUSeconds()) 35 #define gk_getcputimer(tmr) (tmr) 36 37 #define gk_clearwctimer(tmr) (tmr = 0.0) 38 #define gk_startwctimer(tmr) (tmr -= gk_WClockSeconds()) 39 #define gk_stopwctimer(tmr) (tmr += gk_WClockSeconds()) 40 #define gk_getwctimer(tmr) (tmr) 41 42 /*------------------------------------------------------------- 43 * dbglvl handling macros 44 *-------------------------------------------------------------*/ 45 #define IFSET(a, flag, cmd) if ((a)&(flag)) (cmd); 46 47 48 /*------------------------------------------------------------- 49 * gracefull library exit macro 50 *-------------------------------------------------------------*/ 51 #define GKSETJMP() (setjmp(gk_return_to_entry)) 52 #define gk_sigcatch() (setjmp(gk_jbufs[gk_cur_jbufs])) 53 54 55 /*------------------------------------------------------------- 56 * Debuging memory leaks 57 *-------------------------------------------------------------*/ 58 #ifdef DMALLOC 59 # define MALLOC_CHECK(ptr) \ 60 if (malloc_verify((ptr)) == DMALLOC_VERIFY_ERROR) { \ 61 printf("***MALLOC_CHECK failed on line %d of file %s: " #ptr "\n", \ 62 __LINE__, __FILE__); \ 63 abort(); \ 64 } 65 #else 66 # define MALLOC_CHECK(ptr) ; 67 #endif 68 69 70 /*------------------------------------------------------------- 71 * CSR conversion macros 72 *-------------------------------------------------------------*/ 73 #define MAKECSR(i, n, a) \ 74 do { \ 75 for (i=1; i<n; i++) a[i] += a[i-1]; \ 76 for (i=n; i>0; i--) a[i] = a[i-1]; \ 77 a[0] = 0; \ 78 } while(0) 79 80 #define SHIFTCSR(i, n, a) \ 81 do { \ 82 for (i=n; i>0; i--) a[i] = a[i-1]; \ 83 a[0] = 0; \ 84 } while(0) 85 86 87 /*------------------------------------------------------------- 88 * ASSERTS that cannot be turned off! 89 *-------------------------------------------------------------*/ 90 #define GKASSERT(expr) \ 91 if (!(expr)) { \ 92 printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ 93 __LINE__, __FILE__); \ 94 abort(); \ 95 } 96 97 #define GKASSERTP(expr,msg) \ 98 if (!(expr)) { \ 99 printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ 100 __LINE__, __FILE__); \ 101 printf msg ; \ 102 printf("\n"); \ 103 abort(); \ 104 } 105 106 #define GKCUASSERT(expr) \ 107 if (!(expr)) { \ 108 printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ 109 __LINE__, __FILE__); \ 110 } 111 112 #define GKCUASSERTP(expr,msg) \ 113 if (!(expr)) { \ 114 printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ 115 __LINE__, __FILE__); \ 116 printf msg ; \ 117 printf("\n"); \ 118 } 119 120 /*------------------------------------------------------------- 121 * Program Assertions 122 *-------------------------------------------------------------*/ 123 #ifndef NDEBUG 124 # define ASSERT(expr) \ 125 if (!(expr)) { \ 126 printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ 127 __LINE__, __FILE__); \ 128 assert(expr); \ 129 } 130 131 # define ASSERTP(expr,msg) \ 132 if (!(expr)) { \ 133 printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \ 134 __LINE__, __FILE__); \ 135 printf msg ; \ 136 printf("\n"); \ 137 assert(expr); \ 138 } 139 #else 140 # define ASSERT(expr) ; 141 # define ASSERTP(expr,msg) ; 142 #endif 143 144 #ifndef NDEBUG2 145 # define ASSERT2 ASSERT 146 # define ASSERTP2 ASSERTP 147 #else 148 # define ASSERT2(expr) ; 149 # define ASSERTP2(expr,msg) ; 150 #endif 151 152 153 #endif 154