BKE_assert(), only prints the error unless cmake define WITH_ASSERT_ABORT is enabled...
[blender.git] / source / blender / blenkernel / BKE_utildefines.h
1 /* 
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28 */
29
30 #ifndef BKE_UTILDEFINES_H
31 #define BKE_UTILDEFINES_H
32
33 #ifndef FALSE
34 #define FALSE 0
35 #endif
36
37 #ifndef TRUE
38 #define TRUE 1
39 #endif
40
41 /* Macro to convert a value to string in the preprocessor
42  * STRINGIFY_ARG: gives the defined name in the string
43  * STRINGIFY: gives the defined value. */
44 #define STRINGIFY_ARG(x) #x
45 #define STRINGIFY(x) STRINGIFY_ARG(x)
46
47 /* useful for debugging */
48 #define AT __FILE__ ":" STRINGIFY(__LINE__)
49
50
51 #ifdef __GNUC__
52 #  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
53 #else
54 #  define UNUSED(x) UNUSED_ ## x
55 #endif
56
57
58 /* BKE_assert(), default only to print
59  * for aborting need to define WITH_ASSERT_ABORT */
60 #if !defined NDEBUG
61 #  ifdef WITH_ASSERT_ABORT
62 #    define _dummy_abort abort
63 #  else
64 #    define _dummy_abort() (void)0
65 #  endif
66 #  ifdef __GNUC__ /* just want to check if __func__ is available */
67 #    define BKE_assert(a) \
68 do { \
69         if (0 == (a)) { \
70                 fprintf(stderr, \
71                         "BKE_assert failed: %s, %s(), %d at \'%s\'\n", \
72                         __FILE__, __func__, __LINE__, STRINGIFY(a)); \
73                 _dummy_abort(); \
74         } \
75 } while (0)
76 #  else
77 #    define BKE_assert(a) \
78 do { \
79         if (0 == (a)) { \
80                 fprintf(stderr, \
81                         "BKE_assert failed: %s, %d at \'%s\'\n", \
82                         __FILE__, __LINE__, STRINGIFY(a)); \
83                 _dummy_abort(); \
84         } \
85 } while (0)
86 #  endif
87 #else
88 #  define BKE_assert(a) (void)0
89 #endif
90
91
92 /* these values need to be hardcoded in structs, dna does not recognize defines */
93 /* also defined in DNA_space_types.h */
94 #ifndef FILE_MAXDIR
95 #define FILE_MAXDIR                     160
96 #define FILE_MAXFILE            80
97 #define FILE_MAX                        240
98 #endif
99
100 #define ELEM(a, b, c)           ( (a)==(b) || (a)==(c) )
101 #define ELEM3(a, b, c, d)       ( ELEM(a, b, c) || (a)==(d) )
102 #define ELEM4(a, b, c, d, e)    ( ELEM(a, b, c) || ELEM(a, d, e) )
103 #define ELEM5(a, b, c, d, e, f) ( ELEM(a, b, c) || ELEM3(a, d, e, f) )
104 #define ELEM6(a, b, c, d, e, f, g)      ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
105 #define ELEM7(a, b, c, d, e, f, g, h)   ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
106 #define ELEM8(a, b, c, d, e, f, g, h, i)        ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
107 #define ELEM9(a, b, c, d, e, f, g, h, i, j)        ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
108 #define ELEM10(a, b, c, d, e, f, g, h, i, j, k)        ( ELEM4(a, b, c, d, e) || ELEM6(a, f, g, h, i, j, k) )
109 #define ELEM11(a, b, c, d, e, f, g, h, i, j, k, l)        ( ELEM4(a, b, c, d, e) || ELEM7(a, f, g, h, i, j, k, l) )
110
111 /* shift around elements */
112 #define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
113 #define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
114
115 /* min/max */
116 #define MIN2(x,y)               ( (x)<(y) ? (x) : (y) )
117 #define MIN3(x,y,z)             MIN2( MIN2((x),(y)) , (z) )
118 #define MIN4(x,y,z,a)           MIN2( MIN2((x),(y)) , MIN2((z),(a)) )
119
120 #define MAX2(x,y)               ( (x)>(y) ? (x) : (y) )
121 #define MAX3(x,y,z)             MAX2( MAX2((x),(y)) , (z) )
122 #define MAX4(x,y,z,a)           MAX2( MAX2((x),(y)) , MAX2((z),(a)) )
123
124 #define INIT_MINMAX(min, max) { (min)[0]= (min)[1]= (min)[2]= 1.0e30f; (max)[0]= (max)[1]= (max)[2]= -1.0e30f; }
125
126 #define INIT_MINMAX2(min, max) { (min)[0]= (min)[1]= 1.0e30f; (max)[0]= (max)[1]= -1.0e30f; }
127
128 #define DO_MIN(vec, min) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0];      \
129                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1];   \
130                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; } \
131
132 #define DO_MAX(vec, max) { if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0];          \
133                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1];   \
134                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
135
136 #define DO_MINMAX(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
137                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
138                                                           if( (min)[2]>(vec)[2] ) (min)[2]= (vec)[2]; \
139                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
140                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; \
141                                                           if( (max)[2]<(vec)[2] ) (max)[2]= (vec)[2]; } \
142
143 #define DO_MINMAX2(vec, min, max) { if( (min)[0]>(vec)[0] ) (min)[0]= (vec)[0]; \
144                                                           if( (min)[1]>(vec)[1] ) (min)[1]= (vec)[1]; \
145                                                           if( (max)[0]<(vec)[0] ) (max)[0]= (vec)[0]; \
146                                                           if( (max)[1]<(vec)[1] ) (max)[1]= (vec)[1]; }
147
148 /* some math and copy defines */
149
150 #ifndef SWAP
151 #define SWAP(type, a, b)        { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
152 #endif
153
154 #define ABS(a)                                  ( (a)<0 ? (-(a)) : (a) )
155
156 #define AVG2(x, y)              ( 0.5 * ((x) + (y)) )
157
158 #define FTOCHAR(val) ((val)<=0.0f)? 0 : (((val)>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*(val))+0.5f))
159 #define FTOUSHORT(val) ((val >= 1.0f-0.5f/65535)? 65535: (val <= 0.0f)? 0: (unsigned short)(val*65535.0f + 0.5f))
160
161 #define VECCOPY(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
162 #define VECCOPY2D(v1,v2)          {*(v1)= *(v2); *(v1+1)= *(v2+1);}
163 #define QUATCOPY(v1,v2)         {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
164 #define LONGCOPY(a, b, c)       {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
165
166
167 #define VECADD(v1,v2,v3)        {*(v1)= *(v2) + *(v3); *(v1+1)= *(v2+1) + *(v3+1); *(v1+2)= *(v2+2) + *(v3+2);}
168 #define VECSUB(v1,v2,v3)        {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1); *(v1+2)= *(v2+2) - *(v3+2);}
169 #define VECSUB2D(v1,v2,v3)      {*(v1)= *(v2) - *(v3); *(v1+1)= *(v2+1) - *(v3+1);}
170 #define VECADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac);}
171 #define VECSUBFAC(v1,v2,v3,fac) {*(v1)= *(v2) - *(v3)*(fac); *(v1+1)= *(v2+1) - *(v3+1)*(fac); *(v1+2)= *(v2+2) - *(v3+2)*(fac);}
172 #define QUATADDFAC(v1,v2,v3,fac) {*(v1)= *(v2) + *(v3)*(fac); *(v1+1)= *(v2+1) + *(v3+1)*(fac); *(v1+2)= *(v2+2) + *(v3+2)*(fac); *(v1+3)= *(v2+3) + *(v3+3)*(fac);}
173
174 #define INPR(v1, v2)            ( (v1)[0]*(v2)[0] + (v1)[1]*(v2)[1] + (v1)[2]*(v2)[2] )
175
176
177 /* some misc stuff.... */
178 #define CLAMP(a, b, c)          if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
179 #define CLAMPIS(a, b, c) ((a)<(b) ? (b) : (a)>(c) ? (c) : (a))
180 #define CLAMPTEST(a, b, c)      if((b)<(c)) {CLAMP(a, b, c);} else {CLAMP(a, c, b);}
181
182 #define IS_EQ(a,b) ((fabs((double)(a)-(b)) >= (double) FLT_EPSILON) ? 0 : 1)
183
184 #define IS_EQT(a, b, c) ((a > b)? (((a-b) <= c)? 1:0) : ((((b-a) <= c)? 1:0)))
185 #define IN_RANGE(a, b, c) ((b < c)? ((b<a && a<c)? 1:0) : ((c<a && a<b)? 1:0))
186 #define IN_RANGE_INCL(a, b, c) ((b < c)? ((b<=a && a<=c)? 1:0) : ((c<=a && a<=b)? 1:0))
187
188 /* this weirdo pops up in two places ... */
189 #if !defined(WIN32)
190 #ifndef O_BINARY
191 #define O_BINARY 0
192 #endif
193 #endif
194
195 /* INTEGER CODES */
196 #if defined(__sgi) || defined (__sparc) || defined (__sparc__) || defined (__PPC__) || defined (__ppc__) || defined (__hppa__) || defined (__BIG_ENDIAN__)
197         /* Big Endian */
198 #define MAKE_ID(a,b,c,d) ( (int)(a)<<24 | (int)(b)<<16 | (c)<<8 | (d) )
199 #else
200         /* Little Endian */
201 #define MAKE_ID(a,b,c,d) ( (int)(d)<<24 | (int)(c)<<16 | (b)<<8 | (a) )
202 #endif
203
204 #define ID_NEW(a)               if( (a) && (a)->id.newid ) (a)= (void *)(a)->id.newid
205
206 #define FORM MAKE_ID('F','O','R','M')
207
208 #define BLEN MAKE_ID('B','L','E','N')
209 #define DER_ MAKE_ID('D','E','R','_')
210 #define V100 MAKE_ID('V','1','0','0')
211
212 #define DATA MAKE_ID('D','A','T','A')
213 #define GLOB MAKE_ID('G','L','O','B')
214 #define IMAG MAKE_ID('I','M','A','G')
215
216 #define DNA1 MAKE_ID('D','N','A','1')
217 #define TEST MAKE_ID('T','E','S','T') /* used as preview between 'REND' and 'GLOB' */
218 #define REND MAKE_ID('R','E','N','D')
219 #define USER MAKE_ID('U','S','E','R')
220
221 #define ENDB MAKE_ID('E','N','D','B')
222
223
224 /* This one rotates the bytes in an int64, int (32) and short (16) */
225 #define SWITCH_INT64(a) { \
226         char s_i, *p_i; \
227         p_i= (char *)&(a); \
228         s_i=p_i[0]; p_i[0]=p_i[7]; p_i[7]=s_i; \
229         s_i=p_i[1]; p_i[1]=p_i[6]; p_i[6]=s_i; \
230         s_i=p_i[2]; p_i[2]=p_i[5]; p_i[5]=s_i; \
231         s_i=p_i[3]; p_i[3]=p_i[4]; p_i[4]=s_i; }
232
233 #define SWITCH_INT(a) { \
234         char s_i, *p_i; \
235         p_i= (char *)&(a); \
236         s_i=p_i[0]; p_i[0]=p_i[3]; p_i[3]=s_i; \
237         s_i=p_i[1]; p_i[1]=p_i[2]; p_i[2]=s_i; }
238
239 #define SWITCH_SHORT(a) { \
240         char s_i, *p_i; \
241         p_i= (char *)&(a); \
242         s_i=p_i[0]; p_i[0]=p_i[1]; p_i[1]=s_i; }
243
244
245 /* Bit operations */
246 #define BTST(a,b)       ( ( (a) & 1<<(b) )!=0 )   
247 #define BNTST(a,b)      ( ( (a) & 1<<(b) )==0 )
248 #define BTST2(a,b,c)    ( BTST( (a), (b) ) || BTST( (a), (c) ) )
249 #define BSET(a,b)       ( (a) | 1<<(b) )
250 #define BCLR(a,b)       ( (a) & ~(1<<(b)) )
251 /* bit-row */
252 #define BROW(min, max)  (((max)>=31? 0xFFFFFFFF: (1<<(max+1))-1) - ((min)? ((1<<(min))-1):0) )
253
254
255 #ifdef GS
256 #undef GS
257 #endif
258 #define GS(a)   (*((short *)(a)))
259
260 /* Warning-free macros for storing ints in pointers. Use these _only_
261  * for storing an int in a pointer, not a pointer in an int (64bit)! */
262 #define SET_INT_IN_POINTER(i) ((void*)(intptr_t)(i))
263 #define GET_INT_FROM_POINTER(i) ((int)(intptr_t)(i))
264
265 /*little array macro library.  example of usage:
266
267 int *arr = NULL;
268 V_DECLARE(arr);
269 int i;
270
271 for (i=0; i<10; i++) {
272         V_GROW(arr);
273         arr[i] = something;
274 }
275 V_FREE(arr);
276
277 arrays are buffered, using double-buffering (so on each reallocation,
278 the array size is doubled).  supposedly this should give good Big Oh
279 behaviour, though it may not be the best in practice.
280 */
281
282 #define V_DECLARE(vec) int _##vec##_count=0; void *_##vec##_tmp
283
284 /*in the future, I plan on having V_DECLARE allocate stack memory it'll
285   use at first, and switch over to heap when it needs more.  that'll mess
286   up cases where you'd want to use this API to build a dynamic list for
287   non-local use, so all such cases should use this macro.*/
288 #define V_DYNDECLARE(vec) V_DECLARE(vec)
289
290 /*this returns the entire size of the array, including any buffering.*/
291 #define V_SIZE(vec) ((signed int)((vec)==NULL ? 0 : MEM_allocN_len(vec) / sizeof(*vec)))
292
293 /*this returns the logical size of the array, not including buffering.*/
294 #define V_COUNT(vec) _##vec##_count
295
296 /*grow the array by one.  zeroes the new elements.*/
297 #define V_GROW(vec) \
298         V_SIZE(vec) > _##vec##_count ? _##vec##_count++ : \
299         ((_##vec##_tmp = MEM_callocN(sizeof(*vec)*(_##vec##_count*2+2), #vec " " __FILE__ " ")),\
300         (void)(vec && memcpy(_##vec##_tmp, vec, sizeof(*vec) * _##vec##_count)),\
301         (void)(vec && (MEM_freeN(vec),1)),\
302         (vec = _##vec##_tmp),\
303         _##vec##_count++)
304
305 #define V_FREE(vec) if (vec) MEM_freeN(vec);
306
307 /*resets the logical size of an array to zero, but doesn't
308   free the memory.*/
309 #define V_RESET(vec) _##vec##_count=0
310
311 /*set the count of the array*/
312 #define V_SETCOUNT(vec, count) _##vec##_count = (count)
313
314 /*little macro so inline keyword works*/
315 #if defined(_MSC_VER)
316 #define BM_INLINE static __forceinline
317 #elif defined(__GNUC__)
318 #define BM_INLINE static inline __attribute((always_inline))
319 #else
320 /* #warning "MSC/GNUC defines not found, inline non-functional" */
321 #define BM_INLINE static 
322 #endif
323
324 #define BMEMSET(mem, val, size) {unsigned int _i; char *_c = (char*) mem; for (_i=0; _i<size; _i++) *_c++ = val;}
325
326 #endif