29 # define UnusedVar __attribute__((unused))
30 # define MustUseResult __attribute__((warn_unused_result))
33 # define MustUseResult
38 #define M_2PI 6.28318530717958647693
51 inline num max(num a,num b)
53 return((a > b)? a : b);
57 inline num min(num a,num b)
59 return((a < b)? a : b);
63 inline void swap(data &a,data &b)
74 inline num minVar(
int n,num* list)
78 for(
int i = 1; i <= n; i++) {
88 inline num maxVar(
int n,num* list)
92 for(
int i = 1; i <= n; i++) {
102 inline double frand()
104 return (
double(rand())/
double(RAND_MAX) );
108 inline num frand(num minVal,num maxVal)
110 return ( num(rand())/num(RAND_MAX)*(maxVal-minVal) +minVal );
116 inline num randn(num stdDev = 1.0, num mean = 0.0)
119 num u1 = ((num)rand())/((num)RAND_MAX);
120 num u2 = ((num)rand())/((num)RAND_MAX);
121 num z1 = sqrt(-2.0*log(u1)) * sin(M_2PI*u2);
123 num x1 = z1 * stdDev + mean;
130 inline void randn2(num &x1, num &x2)
133 num u1 = ((num)rand())/((num)RAND_MAX);
134 num u2 = ((num)rand())/((num)RAND_MAX);
135 num r = sqrt(-2.0*log(u1));
136 x1 = r * sin(M_2PI*u2);
137 x2 = r * cos(M_2PI*u2);
140 template <
class num1,
class num2>
141 inline num1 bound(num1 x,num2 low,num2 high) MustUseResult;
143 template <
class num1,
class num2>
144 inline num1 bound(num1 x,num2 low,num2 high)
146 if(x < low ) x = low;
147 if(x > high) x = high;
151 template <
class num1,
class num2>
152 inline num1 abs_bound(num1 x,num2 range) MustUseResult;
154 template <
class num1,
class num2>
155 inline num1 abs_bound(num1 x,num2 range)
158 if(x < -range) x = -range;
159 if(x > range) x = range;
164 inline num abs_max(num a,num b)
166 return((fabs(a) > fabs(b))? a : b);
170 inline num abs_min(num a,num b)
172 return((fabs(a) < fabs(b))? a : b);
176 inline num max3(num a,num b,num c)
179 return((a > c)? a : c);
181 return((b > c)? b : c);
186 inline num min3(num a,num b,num c)
189 return((a < c)? a : c);
191 return((b < c)? b : c);
196 inline num max4(num a,num b,num c,num d)
205 inline num min4(num a,num b,num c,num d)
214 inline num max_abs(num a,num b)
216 return((fabs(a) > fabs(b))? a : b);
220 inline num min_abs(num a,num b)
222 return((fabs(a) < fabs(b))? a : b);
225 template <
class data_t>
226 inline int max_idx(data_t *arr,
int num)
229 for(
int i=1; i<num; i++){
230 if(arr[i] > arr[mi]) mi = i;
235 template <
class data_t>
236 inline int min_idx(data_t *arr,
int num)
239 for(
int i=1; i<num; i++){
240 if(arr[i] < arr[mi]) mi = i;
246 inline void sort(num &a,num &b,num &c)
254 inline bool take_min(num &base,num val)
265 inline bool take_max(num &base,num val)
275 template <
class real>
276 inline real sq(real x) MustUseResult;
278 template <
class real>
284 template <
class real>
285 inline real cube(real x) MustUseResult;
287 template <
class real>
294 inline num sign_nz(num x)
296 return((x >= 0)? 1 : -1);
300 inline num sign_eq(num a,num b)
306 inline num sign(num x)
308 return((x >= 0)? (x > 0) : -1);
311 template <
class bool_t>
312 inline void toggle(bool_t &b)
318 inline num gcd(num x,num y)
337 num r = (x / d) * (y / d);
343 inline num mod(num x,num m)
347 return(((x % m) + m) % m);
350 template <
class real>
351 inline real fmodt(real x,real m)
355 return(x - floor(x / m)*m);
358 template <
class real>
359 inline real ramp(real x,real x0,real x1)
363 if(x < x0)
return(0);
364 if(x > x1)
return(1);
365 return((x - x0) / (x1 - x0));
368 template <
class real>
369 inline real ramp(real x, real x0,real y0, real x1,real y1)
373 if(x < x0)
return(y0);
374 if(x > x1)
return(y1);
375 return(y0 + (y1 - y0) * (x - x0) / (x1 - x0));
378 template <
class num,
class num2>
379 inline num bool_sat_count(num cnt,num2 min,num2 max,
bool val)
385 return((cnt < max)? cnt+1 : max);
387 return((cnt > min)? cnt-1 : min);
395 inline bool one_bit_set(num n)
398 return(n!=0 && ((-n) & n) == n);
402 inline num num_bits_set(num x)
406 for(num i = 0; i<
sizeof(num)*8; i++){
413 template <
class num1,
class num2>
414 inline bool all_bits_set(num1 x,num2 m)
417 return((x & m) == m);
420 template <
class num1,
class num2>
421 inline bool any_bits_set(num1 x,num2 m)
424 return((x & m) != 0);
430 template <
class real>
431 inline real angle_mod(real angle) MustUseResult;
433 template <
class real>
434 real angle_mod(real angle)
436 angle -= M_2PI * rint(angle / M_2PI);
442 template <
class real>
443 inline real angle_long(real angle)
446 return M_2PI + angle;
448 return -M_2PI + angle;
453 template <
class real>
454 inline real angle_pos(real angle)
456 return(fmod(angle+M_2PI,M_2PI));
460 template <
class real>
461 inline real angle_diff(real a,real b)
466 d -= M_2PI * rint(d / M_2PI);
472 template <
class real>
473 inline real angle_dist(real a,real b)
475 return(fabs(angle_mod(a-b)));
480 template <
class real>
481 inline real avg_angle(real left,real right)
485 if(left < right) left += 2*M_PI;
486 result = (left + right)/2;
487 if(result > M_PI) result -= 2*M_PI;
492 template <
class real>
493 inline real abs_bound_angle(real bound_angle,real tolerance,real a) MustUseResult;
498 template <
class real>
499 real abs_bound_angle(real bound_angle,real tolerance,real a)
501 real x = angle_mod(a - bound_angle);
502 x = abs_bound(x,tolerance);
503 return(angle_mod(x + bound_angle));
508 template <
class data>
509 int find_item(
const data *arr,
int num,data key)
512 while(i<num && !(arr[i]==key)) i++;
516 template <
class data,
class num>
517 data *alloc_array(data *arr,num &size,num new_size) MustUseResult;
519 template <
class data,
class num>
520 data *alloc_array(data *arr,num &size,num new_size)
522 if((arr!=NULL && new_size==size) ||
523 (arr==NULL && new_size==0))
return(arr);
526 arr =
new data[new_size];
527 size = (arr != NULL)? new_size : 0;
531 template <
class data,
class num>
532 data *resize_array(data *arr,num &size,num new_size,num cur_used)
534 if((arr!=NULL && new_size==size) ||
535 (arr==NULL && new_size==0))
return(arr);
537 data *narr =
new data[new_size];
540 for(num i=0; i<cur_used; i++) narr[i] = arr[i];
550 template <
class data,
class num>
551 void free_array(data *&arr,num &size)
558 template <
class data,
class num>
559 data *alloc_array2(data *arr,num &w,num &h,
560 int new_w,
int new_h) MustUseResult;
562 template <
class data,
class num>
563 data *alloc_array2(data *arr,num &w,num &h,
567 int new_size = new_w * new_h;
569 if((arr!=NULL && new_size==size) ||
570 (arr==NULL && new_size==0))
return(arr);
573 arr =
new data[new_size];
584 template <
class data>
585 void set_range(data *arr,
int start,
int num,
const data &val)
588 for(
int i=start; i<num; i++) arr[i] = val;
593 template <
class data>
594 inline int mcopy(data *dest,data *src,
int num)
598 for(i=0; i<num; i++) dest[i] = src[i];
603 template <
class data>
604 inline data mset(data *dest,data val,
int num)
608 for(i=0; i<num; i++) dest[i] = val;
613 template <
class data>
614 inline void mzero(data &d)
616 memset(&d,0,
sizeof(d));
619 template <
class data>
620 inline void mzero(data *d,
int n)
622 memset(d,0,
sizeof(data)*n);
626 # define likely(x) __builtin_expect(!!(x),1)
627 # define unlikely(x) __builtin_expect(!!(x),0)
629 # define likely(x) (x)
630 # define unlikely(x) (x)